プロジェクト全体の末尾の空白をすべて削除するにはどうすればよいですか?ルートディレクトリから開始し、すべてのフォルダ内のすべてのファイルから末尾の空白を削除します。
また、すべてをstdoutに出力するだけでなく、ファイルを直接変更できるようにしたいと考えています。
プロジェクト全体の末尾の空白をすべて削除するにはどうすればよいですか?ルートディレクトリから開始し、すべてのフォルダ内のすべてのファイルから末尾の空白を削除します。
また、すべてをstdoutに出力するだけでなく、ファイルを直接変更できるようにしたいと考えています。
回答:
OS X> = 10.6 Snow Leopardソリューションです。
.gitおよび.svnフォルダーとその内容は無視されます。また、バックアップファイルは残りません。
export LC_CTYPE=C
export LANG=C
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"
\+
代わりにを使用することで、処理速度を上げることができ*
ます。それ以外の場合は、すべての行で一致します。
sed: RE error: illegal byte sequence
私に返ってきます。
export LANG=C
してもう一度お試しください
export LC_CTYPE=C
:ここに見られるようなstackoverflow.com/questions/19242275/...
使用する:
find . -type f -print0 | xargs -0 perl -pi.bak -e 's/ +$//'
「.bak」ファイルを生成したくない場合:
find . -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
zshユーザーとして、findの呼び出しを省略して、代わりに次を使用できます。
perl -pi -e 's/ +$//' **/*
注:.git
ディレクトリの破壊を防ぐには、以下を追加してください-not -iwholename '*.git*'
。
.git
なく、ネストの深さに関係なく、ディレクトリを持つフォルダー内では実行しないでください。
find . -not \( -name .svn -prune -o -name .git -prune \) -type f -print0 | xargs -0 perl -pi -e 's/ +$//'
rsync -rv --exclude=.git repo/ repo2/
、ローカルの変更repo
も(破損していない)にありましたrepo2
。
DOS改行(CR / LF)でも機能し、バイナリファイルを回避する上で非常に優れた2つの代替アプローチ:
MIMEタイプが次で始まることを確認する一般的なソリューションtext/
:
while IFS= read -r -d '' -u 9
do
if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
then
sed -i 's/[ \t]\+\(\r\?\)$/\1/' -- "$REPLY"
else
echo "Skipping $REPLY" >&2
fi
done 9< <(find . -type f -print0)
バイナリと見なされるファイルをスキップする-I
オプションを使用するMatによる Gitリポジトリ固有のソリューションgit grep
:
git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'
バッシュで:
find dir -type f -exec sed -i 's/ *$//' '{}' ';'
注:.git
リポジトリを使用している場合は、以下を追加してみてください-not -iwholename '.git'
。
これは、GNU sedやxargsを使用しないOSX 10.5 Leopardで私にとってはうまくいきました。
find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"
除外する必要があるファイルがある場合は注意してください(私は除外しました)。
-pruneを使用して、特定のディレクトリまたはファイルを無視できます。gitリポジトリ内のPythonファイルの場合、次のようなものを使用できます。
find dir -not -path '.git' -iname '*.py'
find dir -not -path '.git' -iname '*.py' -print0 | xargs -0 sed --in-place=.bak 's/[[:space:]]*$//'
。dir
再帰する最上位として、問題のディレクトリに置き換えます。
sed -i .bak
?それはsed -i.bak
(スペースなしで)すべきではありませんか?
Ackはこの種のタスクのために作られました。
これはgrepと同じように機能しますが、.svn、.git、.cvsなどの場所に移動しないことを認識しています。
ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'
find / grepでフープをジャンプするよりもはるかに簡単です。
Ackは、ほとんどのパッケージマネージャを介して(ackまたはack-grepとして)使用できます。
これは単なるPerlプログラムなので、ダウンロードして実行できる単一ファイルバージョンでも利用できます。参照:Ackインストール
ack
素晴らしいです。何年にもわたって使用しており、ほとんどのディストリビューションのほぼすべてのパッケージリポジトリで利用できます。
ex
Exエディター(Vimの一部)を使用してみます。
$ ex +'bufdo!%s/\s\+$//e' -cxa **/*.*
注:再帰(bash4およびzsh)の場合、新しいグロビングオプション(**/*.*
)を使用します。によって有効にしshopt -s globstar
ます。
次の関数をに追加できます.bash_profile
。
# Strip trailing whitespaces.
# Usage: trim *.*
# See: https://stackoverflow.com/q/10711051/55075
trim() {
ex +'bufdo!%s/\s\+$//e' -cxa $*
}
sed
を使用するにはsed
、以下を確認してください:sedで末尾の空白を削除するには?
find
remove_trail_spaces.sh
ファイルから末尾の空白を削除するための次のスクリプト(例:)を見つけます。
#!/bin/sh
# Script to remove trailing whitespace of all files recursively
# See: /programming/149057/how-to-remove-trailing-whitespace-of-all-files-recursively
case "$OSTYPE" in
darwin*) # OSX 10.5 Leopard, which does not use GNU sed or xargs.
find . -type f -not -iwholename '*.git*' -print0 | xargs -0 sed -i .bak -E "s/[[:space:]]*$//"
find . -type f -name \*.bak -print0 | xargs -0 rm -v
;;
*)
find . -type f -not -iwholename '*.git*' -print0 | xargs -0 perl -pi -e 's/ +$//'
esac
スキャンするディレクトリからこのスクリプトを実行します。最後のOSXでは、で終わるすべてのファイルが削除されます.bak
。
あるいは単に:
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
これは、Spring Framework Code Styleが推奨する方法です。
find . -type f -name "*.java" -exec perl -p -i -e "s/[ \t]$//g" {} \;
すべてではなく、末尾のスペースを1つだけ削除します。
検索を使用せず、バックアップファイルを作成しませんでした。
sed -i '' 's/[[:space:]]*$//g' **/*.*
ファイルツリーの深さによっては、これ(短いバージョン)で十分な場合があります。
注:これには、たとえばバイナリファイルも含まれます。
ファイルを除外する代わりに、上記のバリエーションを以下に示します。これらは、ファイル拡張子に基づいて、削除するファイルを明示的にホワイトリストにしたもので、自由に味付けして試してみてください。
find . \( -name *.rb -or -name *.html -or -name *.js -or -name *.coffee -or \
-name *.css -or -name *.scss -or -name *.erb -or -name *.yml -or -name *.ru \) \
-print0 | xargs -0 sed -i '' -E "s/[[:space:]]*$//"
-name "*.rb*"
私はこれを実行しましたが、これはpojoバージョンとadamsバージョンのミックスです。
末尾の空白と、末尾の空白の別の形式であるキャリッジリターンの両方を削除します。
find . -not \( -name .svn -prune -o -name .git -prune \) -type f \
-exec sed -i 's/[:space:]+$//' \{} \; \
-exec sed -i 's/\r\n$/\n/' \{} \;
.gitフォルダーがある場合、それは触れません。
編集:コメントの後に少し安全になり、「。git」または「.svn」が含まれているファイルを取得できなくなりました。しかし注意してください、あなたがいくつかを持っているなら、それはバイナリファイルに触れます。.pyや.php-filesだけに触れたい場合は-iname "*.py" -or -iname "*.php"
、後で使用し-type f
ます。
Update 2:行末のすべての種類のスペースを置き換えます(つまり、タブも意味します)。
正規表現を使用しています。4つのステップ:
これにより、すべてのファイルの各行の末尾にある末尾のスペースがすべて削除されます。また、このニーズに合わないファイルを除外することもできます。
1)他の多くの回答が使用しています-E
。ドキュメントに記載されていないBSD互換性オプションであるため、理由はわかりません。-r
代わりに使用する必要があります。
2)その他の回答はを使用します-i ''
。直後にサフィックスが付いているので、それは-i
(または-i''
優先される場合)-i
正しいはずです。
3)Git固有のソリューション:
git config --global alias.check-whitespace \
'git diff-tree --check $(git hash-object -t tree /dev/null) HEAD'
git check-whitespace | grep trailing | cut -d: -f1 | uniq -u -z | xargs -0 sed --in-place -e 's/[ \t]+$//'
最初のものcheck-whitespace
は、末尾の空白を含むファイルをリストするgitエイリアスを登録します。2つ目sed
はそれらで実行されます。
私はのみを使用\t
するのではなく[:space:]
、私は通常、垂直タブ、フォームフィードと非破壊可能なスペースが表示されていないよう。測定値は異なる場合があります。
これは私にとってうまくいくものです(Mac OS X 10.8、HomebrewによってインストールされたGNU sed):
find . -path ./vendor -prune -o \
\( -name '*.java' -o -name '*.xml' -o -name '*.css' \) \
-exec gsed -i -E 's/\t/ /' \{} \; \
-exec gsed -i -E 's/[[:space:]]*$//' \{} \; \
-exec gsed -i -E 's/\r\n/\n/' \{} \;
末尾のスペースを削除し、タブをスペースに置き換え、Windows CRLFをUnixに置き換えます\n
。
興味深いのは、すべてのクリーニングgsed
手順によって、すべてのファイルが修正される前にこれを3〜4回実行する必要があることです。