場合によっては、「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 サンプル_以前.TXT ./sample.TXT サンプル_以降.TXT
代わりに、次を生成します。
./sample.txt サンプル_以前.TXT ./sample.txt サンプル_以降.TXT
(この例は、バックティック「`」を使用した古いコマンド置換を使用してテストされており、結果は同じでした。)
私は何が間違っていましたか?
答え1
コマンドの置き換えは開始前に行われます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 %s\n" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'