この質問にはすでに回答があります :if command in find -exec
(2つの回答)
11か月前に閉鎖されました。
Linux
(2つの回答)
11か月前に閉鎖されました。
「find」、「bash」、「sed」が期待どおりに機能しない場合があるようです。
次の例では、最初にファイル「sample.txt」を作成し、次にファイルを見つけて、最後に「-exec」コマンドで処理する必要があります。実行されたコマンドは、見つかったファイル名、テスト標本、および変更されたファイル名を出力します。 「sed」コマンド自体は、「txt」を「TXT」に置き換えるために使用されます。
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") ;
期待される出力は次のとおりです。
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
代わりに、以下を生成します:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(この例は、同じ結果のバッククォート「`」による旧式のコマンド置換でもテストされています)
何が間違っているのですか?
承認された回答:
コマンド置換は、find
の前に実行されます でも始まります。実行される実際のコマンド(置換、拡張、引用符の削除などの後)は
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
何かを実行する必要がある場合 -exec
を使用したファンシー(パイプまたは複数のコマンド) 、次に別のシェルを起動して実行します:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'