プロジェクト全体の末尾の空白をすべて削除するにはどうすればよいですか? ルート ディレクトリから開始し、すべてのフォルダー内のすべてのファイルから末尾の空白を削除します。
また、すべてを標準出力に出力するだけでなく、ファイルを直接変更できるようにしたいと考えています。
プロジェクト全体の末尾の空白をすべて削除するにはどうすればよいですか? ルート ディレクトリから開始し、すべてのフォルダー内のすべてのファイルから末尾の空白を削除します。
また、すべてを標準出力に出力するだけでなく、ファイルを直接変更できるようにしたいと考えています。
これは、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 | perl -0ne 'print if -T' | xargs -0 sed -Ei 's/[[:blank:]]+$//'
使用する:
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*'
.
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)
Gitがバイナリと見なすファイルをスキップする-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'
.
これは、GNUsedやxargsを使用しないOSX10.5Leopardで機能しました。
find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"
除外する必要のあるファイルがある場合は、これに注意してください(私はそうしました)!
-pruneを使用して、特定のディレクトリまたはファイルを無視できます。gitリポジトリ内のPythonファイルの場合、次のようなものを使用できます。
find dir -not -path '.git' -iname '*.py'
Ack は、この種のタスクのために作成されました。
これは grep と同じように機能しますが、.svn、.git、.cvs などの場所に下がらないことを認識しています。
ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'
find/grep でフープをジャンプするよりもはるかに簡単です。
Ack は、ほとんどのパッケージ マネージャーから利用できます ( ackまたはack-grepとして)。
これは単なる Perl プログラムであるため、ダウンロードして実行するだけの単一ファイル バージョンでも利用できます。参照:インストールの確認
結局、findを使用せず、バックアップファイルを作成しませんでした。
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:]]*$//"
これは、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 ファイルなどにのみ触れたい場合は-iname "*.py" -or -iname "*.php"
afterを使用します。-type f
更新 2 : 行末のすべての種類のスペースを置き換えるようになりました (つまり、タブも意味します)。
これはうまく機能します..特定のファイルタイプの --include を追加/削除します:
egrep -rl ' $' --include *.c * | xargs sed -i 's/\s\+$//g'
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 回実行する必要があることです。