2

この投稿に関して、文字列置換の適用から 1 つ以上のファイルを除外するにはどうすればよいですか? 前述の投稿を例として使用すると、特定のディレクトリのすべての子孫ファイルでたとえば./fpd/font/symbol.php.

私のアイデアは-regexfind コマンドでスイッチを使用することでしたが、残念ながらコマンドの-vようなオプションがないため、置換が必要なファイルと一致しないgrepように正規表現を否定することはできません。

4

3 に答える 3

1

!(または-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
于 2013-10-29T17:44:44.243 に答える
1

これをテストしていませんが、動作するはずです:

find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \;
于 2013-10-29T17:38:07.357 に答える
1

これを Git リポジトリで使用します。

grep -ilr orange . | grep -v ".git" | grep -e "\\.php$" | xargs sed -i s/orange/apple/g {}

そうなる:

  1. 検索と置換は、置換する単語が実際に含まれているファイルでのみ実行します。
  2. .gitフォルダを処理しません。
  3. ファイルのみを処理し.phpます。

言うまでもなく、grepに渡されるリストをフィルタリングするために必要な数のレイヤーを含めることができますxargs

既知の問題点:

少なくとも私の Windows 環境では、パスまたは名前にスペースが含まれるファイルを開くことができません。それを理解したことがありません。誰かがこれを修正する方法を知っているなら、私は知りたいです。

于 2013-10-29T17:45:12.037 に答える