コマンドの要素の出力リストを別のコマンドのパラメーターとして渡したいと思います。私はいくつかの他のページを見つけました:
しかし、それらはより複雑なようです。
find
Linuxコマンドの呼び出しのすべての結果にファイルをコピーしたいだけです。
ここで何が問題なのですか?:
find . -name myFile 2>&1 | cp /home/myuser/myFile $1
ありがとう
コマンドの要素の出力リストを別のコマンドのパラメーターとして渡したいと思います。私はいくつかの他のページを見つけました:
しかし、それらはより複雑なようです。
find
Linuxコマンドの呼び出しのすべての結果にファイルをコピーしたいだけです。
ここで何が問題なのですか?:
find . -name myFile 2>&1 | cp /home/myuser/myFile $1
ありがとう
これはあなたが望むものです:
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
に置き、引数を . で終了します。シェルがそれらを解釈しないように、 andを引用する必要があります。{}
;
{}
;
find . -name myFile -exec cp something "{}" \;
時には-exec
十分ではありません。たとえば、この質問では、Bash パラメーター拡張を使用してファイル名を計算したいと考えていました。そのためには を渡す必要がありますが、その場合、置換-exec bash -c 'your command'
で引用符の問題が発生します。{}
これを解決するには、-print0
fromを使用しfind
て null 文字 (ファイル名では無効) で区切られた結果を出力し、それを null でwhile read
パラメーターを分割するループにパイプします。
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 {}
注: optionは、実行するコマンドと競合する場合に別のプレースホルダーを代わりに使用できるプレースホルダーとして-I {}
定義します。{}