プロジェクト全体の末尾の空白をすべて削除するにはどうすればよいですか?ルートディレクトリから開始し、すべてのフォルダー内のすべてのファイルから末尾の空白を削除します。
また、すべてを標準出力に出力するだけでなく、ファイルを直接変更できるようにしたいと考えています。
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:]]*$//"
つかいます:
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 newlines(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
のgit grep
オプションを使用してファイルをスキップするMatによるGitはバイナリと見なします:
git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'
Bashの場合:
find dir -type f -exec sed -i 's/ *$//' '{}' ';'
注:.git
リポジトリを使用している場合は、-not -iwholename '.git'
を追加してみてください。
これはOSX 10.5 Leopardで有効でした。LeopardはGNU sedまたはxargsを使用しません。
find dir -type f -print0 | xargs -0 sed -i.bak -E "s/[[:space:]]*$//"
除外する必要があるファイルがある場合は、これに注意してください(そうしました)!
-Pruneを使用して、特定のディレクトリまたはファイルを無視できます。 Python gitリポジトリ内のファイルの場合、次のようなものを使用できます。
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プログラムであるため、ダウンロードして実行できる単一ファイルバージョンでも使用できます。参照: Ack Install
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: https://stackoverflow.com/questions/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 . \( -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:]]*$//"
結局、検索を使用せず、バックアップファイルを作成しませんでした。
sed -i '' 's/[[:space:]]*$//g' **/*.*
ファイルツリーの深さによっては、この(短いバージョン)で十分です。
注:これには、たとえばバイナリファイルも必要です。
私はこれを実行することになりました。これは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」を含むファイルを許可しないように、コメントの後に少し安全にしました。しかし、注意してください、willバイナリファイルがあればそれをタッチします。つかいます -iname "*.py" -or -iname "*.php"
の後-type f
タッチしたいだけの場合。 .pyおよび.phpファイル。
更新2:行末のすべての種類のスペースを置き換えます(タブも意味します)
ルビー:
irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }
これはうまく機能します。特定のファイルタイプの追加/削除--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]+$//'
最初のものは、ファイルに末尾の空白をリストするgitエイリアスcheck-whitespace
を登録します。 2番目は、それらに対してsed
を実行します。
通常、垂直タブ、フォームフィード、および改行不可スペースが表示されないため、\t
ではなく[:space:]
のみを使用します。測定値は異なる場合があります。
これは私のために働くものです(Mac OS X 10.8、GNU Homebrewによってインストールされた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回実行する必要があることです。
正規表現を使用しています。 4つのステップ:
これにより、すべてのファイルの各行の末尾にある末尾のスペースがすべて削除されます。また、このニーズに合わないファイルを除外できます。