この投稿に関して、文字列置換の適用から 1 つ以上のファイルを除外するにはどうすればよいですか? 前述の投稿を例として使用すると、特定のディレクトリのすべての子孫ファイルで、たとえば./fpd/font/symbol.php.
私のアイデアは-regexfind コマンドでスイッチを使用することでしたが、残念ながらコマンドの-vようなオプションがないため、置換が必要なファイルと一致しないgrepように正規表現を否定することはできません。
!(または-not) と組み合わせて否定できます-name:
$ find .
.
./a
./a/b.txt
./b
./b/a.txt
$ find . -name \*a\* -print
./a
./b/a.txt
$ find . ! -name \*a\* -print
.
./a/b.txt
./b
$ find . -not -name \*a\* -print
.
./a/b.txt
./b
これをテストしていませんが、動作するはずです:
find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \;
これを Git リポジトリで使用します。
grep -ilr orange . | grep -v ".git" | grep -e "\\.php$" | xargs sed -i s/orange/apple/g {}
そうなる:
.gitフォルダを処理しません。.phpます。言うまでもなく、grepに渡されるリストをフィルタリングするために必要な数のレイヤーを含めることができますxargs。
既知の問題点:
少なくとも私の Windows 環境では、パスまたは名前にスペースが含まれるファイルを開くことができません。それを理解したことがありません。誰かがこれを修正する方法を知っているなら、私は知りたいです。