この投稿に関して、文字列置換の適用から 1 つ以上のファイルを除外するにはどうすればよいですか? 前述の投稿を例として使用すると、特定のディレクトリのすべての子孫ファイルで、たとえば./fpd/font/symbol.php
.
私のアイデアは-regex
find コマンドでスイッチを使用することでしたが、残念ながらコマンドの-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 環境では、パスまたは名前にスペースが含まれるファイルを開くことができません。それを理解したことがありません。誰かがこれを修正する方法を知っているなら、私は知りたいです。