web-dev-qa-db-ja.com

すべてのファイルの末尾の空白を再帰的に削除する方法は?

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

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

118
iamjwc

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:]]*$//"
82
deepwell

つかいます:

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

29
Sec

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リポジトリ固有ソリューション-Igit grepオプションを使用してファイルをスキップするMatによるGitはバイナリと見なします:

git grep -I --name-only -z -e '' | xargs -0 sed -i 's/[ \t]\+\(\r\?\)$/\1/'
27
l0b0

Bashの場合:

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

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

22
Adam Rosenfield

これは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'
14
pojo

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

9
jbbuckley

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 で推奨される方法です。

7
kenorb

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

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:]]*$//"
6
ChicagoBob

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

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

ファイルツリーの深さによっては、この(短いバージョン)で十分です。

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

6

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

5

ルビー:

irb
Dir['lib/**/*.rb'].each{|f| x = File.read(f); File.write(f, x.gsub(/[ \t]+$/,"")) }
4
grosser

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

egrep -rl ' $' --include *.c *  | xargs sed -i 's/\s\+$//g'
4
Grant Murphy

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:]のみを使用します。測定値は異なる場合があります。

2
Ondra Žižka

これは私のために働くものです(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回実行する必要があることです。

1
yegor256

正規表現を使用しています。 4つのステップ:

  1. エディターでルートフォルダーを開きます(Visual Studio Codeを使用しています)。
  2. 左側の検索アイコンをタップし、正規表現モードを有効にします。
  3. 検索バーに「+\n」、置換バーに「\ n」を入力します。
  4. [すべて置換]をクリックします。

これにより、すべてのファイルの各行の末尾にある末尾のスペースがすべて削除されます。また、このニーズに合わないファイルを除外できます。

1
roedeercuco