これはあなたが望むものです:
find . -name myFile -exec cp /home/myuser/myFile {} ';'
これの内訳/説明:
find
:find コマンドの呼び出し.
:現在の作業ディレクトリから検索を開始します。- 深度フラグが指定されていないため、これはすべてのサブフォルダーを再帰的に検索します
-name myFile
:明示的な名前myFile
を持つファイルを検索します-exec
:検索結果については、追加のコマンドを実行してくださいcp /home/myuser/myFile {}
:/home/myuser/myFile
をコピーしますfind
によって返された各結果を上書きする に;{}
を考える 各検索結果がどこに行くのか';'
:find
の後に実行されるさまざまなコマンドを区切るために使用されます
名前にスペースやその他の特殊文字が含まれるファイルについて心配する必要があるかどうかに応じて、これを解決する方法がいくつかあります。
ファイル名にスペースや特殊文字 (文字、数字、ダッシュ、およびアンダースコアのみで構成されている) が含まれていない場合は、次の簡単な解決策が有効です。 $(command)
を使用できます コマンドを実行し、その結果を別のコマンドの引数に代入します。シェルは結果をスペース、タブ、改行、および for
で分割します 各値を $f
に割り当てます 順番に、各値に対してコマンドを実行します。
for f in $(find . -name myFile)
do
cp something $f
done
スペースやタブがある場合は、find の -exec
を使用できます オプション。 -exec command args
を渡します 、 {}
を置く ファイル名を置換したい場所で、引数を ;
で終了します . {}
を引用する必要があります と ;
シェルがそれらを解釈しないようにします。
find . -name myFile -exec cp something "{}" \;
時々 -exec
では十分ではありません。たとえば、この質問では、Bash パラメーター拡張を使用してファイル名を計算したいと考えていました。そのためには、 -exec bash -c 'your command'
を渡す必要があります 、しかし、その後、 {}
で引用の問題に遭遇します 代用。これを解決するには、 -print0
を使用できます find
から null 文字 (ファイル名では無効) で区切られた結果を出力し、それを while read
にパイプします。 null でパラメーターを分割するループ:
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
パイプは、あるプログラムの出力を別のプログラムの入力に送信します。 cp
端末で入力ストリームから読み取るのではなく、コマンド ラインで引数を使用するだけです。
xargs
を使用したい パイプまたは find
で の exec
パイプの代わりに引数。
find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
注:オプション -I {}
{}
を定義 プレースホルダーとして、実行するコマンドと競合する場合は、代わりに別のプレースホルダーを使用できます。