find: パスは式の前になければなりません: `.'find: 述語 `-exec' の後に引用符で囲まれていないパターンがある可能性がありますか?

find: パスは式の前になければなりません: `.'find: 述語 `-exec' の後に引用符で囲まれていないパターンがある可能性がありますか?

このコマンドをバックグラウンドで実行する必要があります

sudo find '/abc/abc/' -type f -exec sed 's/domain1\it/domain2\com/g' '{}' \; . &

しかし、2つの問題があります。

find: paths must precede expression: `.'
find: possible unquoted pattern after predicate `-exec'?

また、これをより高速に「検索して置換」するスマートな方法は他にもあります。sudo find '/abc/abc/' -type f -exec sed 's/domain1\it/domain2\com/g' '{}' ; &grep でもいいでしょうか?

ありがとう

答え1

ディレクトリは存在しますか/abc/abc/? 検索するファイルはどこにありますか? " paths must preceed.." メッセージは暗号メッセージです。これをデコードすると、 の最初の (または最初のいくつかの) パラメータが、 がトラバースするfindディレクトリ ツリーではないことを意味しますfind。残りのパラメータは "find式" であるため、これがエラーの原因です。

実行しようとしているコマンドは-execセミコロン ( ;) で終了する必要があります。しかし、セミコロンはコマンド (の解析) を終了してしまうためfind-execセミコロンはバックスラッシュ ( \) でエスケープする必要があります。つまり、

-exec ...command... \; 「find」マジックの世界へようこそ。「man find」をもう一度読んでみてください。

あなたのsed表現は間違っています。正しくは次のようになります:

 sed -e 's/domain1\.it/domain2\.com/'

バックスラッシュ ( \) は、次の文字の「特殊処理」フラグを反転するだけなので、domain1\itdomain1it」には一致しますが、「 」には一致しません。 domain1.it\i」は特殊文字ではないので、「 」のように扱われますi

関連情報