130

プロジェクト全体の末尾の空白をすべて削除するにはどうすればよいですか? ルート ディレクトリから開始し、すべてのフォルダー内のすべてのファイルから末尾の空白を削除します。

また、すべてを標準出力に出力するだけでなく、ファイルを直接変更できるようにしたいと考えています。

4

15 に答える 15

89

これは、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:]]+$//'
于 2011-02-26T22:02:29.347 に答える
34

使用する:

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*'.

于 2008-09-29T15:07:26.733 に答える
32

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/'
于 2012-04-12T08:58:16.730 に答える
25

バッシュの場合:

find dir -type f -exec sed -i 's/ *$//' '{}' ';'

.git注:リポジトリを使用している場合は、追加してみてください: -not -iwholename '.git'.

于 2008-09-29T15:04:26.897 に答える
15

これは、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'
于 2009-03-12T15:03:02.013 に答える
11

Ack は、この種のタスクのために作成されました。

これは grep と同じように機能しますが、.svn、.git、.cvs などの場所に下がらないことを認識しています。

ack --print0 -l '[ \t]+$' | xargs -0 -n1 perl -pi -e 's/[ \t]+$//'

find/grep でフープをジャンプするよりもはるかに簡単です。

Ack は、ほとんどのパッケージ マネージャーから利用できます ( ackまたはack-grepとして)。

これは単なる Perl プログラムであるため、ダウンロードして実行するだけの単一ファイル バージョンでも利用できます。参照:インストールの確認

于 2013-04-27T00:10:15.130 に答える
6

結局、findを使用せず、バックアップファイルを作成しませんでした。

sed -i '' 's/[[:space:]]*$//g' **/*.*

ファイルツリーの深さによっては、これ(短いバージョン)で十分な場合があります。

たとえば、これにはバイナリファイルも必要です。

于 2009-11-26T14:15:24.887 に答える
6

ファイルを除外する代わりに、ファイル拡張子に基づいてファイルを明示的にホワイトリストにリストする上記のバリエーションを次に示します。

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:]]*$//"
于 2012-03-09T18:40:21.983 に答える
5

これは、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 : 行末のすべての種類のスペースを置き換えるようになりました (つまり、タブも意味します)。

于 2010-11-16T19:24:15.420 に答える
4

これはうまく機能します..特定のファイルタイプの --include を追加/削除します:

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'
于 2012-09-20T08:03:55.497 に答える
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:]測定値は異なる場合があります。

于 2016-11-02T02:52:48.953 に答える
1

これは私にとってうまくいくものです(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 回実行する必要があることです。

于 2012-08-08T09:43:11.600 に答える