2012-11-05 12 views
6

コマンドの要素の出力リストを別のコマンドのパラメータとして渡したいとします。私はいくつかの他のページを発見した:他のコマンドのパラメータとしてLinuxコマンド出力

が、彼らはより複雑であるように見えます。

Linux findコマンドを呼び出すすべての結果にファイルをコピーしたいだけです。

ここで何が間違っている?:

find . -name myFile 2>&1 | cp /home/myuser/myFile $1 

おかげ

答えて

16

これはあなたが望むものである。この

find . -name myFile -exec cp /home/myuser/myFile {} ';' 

内訳/解説:

  • find:現在の作業ディレクトリから検索を開始:findコマンド
  • .を呼び出します。
  • 何の深フラグが指定されていないので、これはすべてのサブフォルダ
  • -name myFileのために再帰的に検索します:それら
  • cp /home/myuser/myFile {}で追加のコマンドを実行し、検索結果のために:明示的な名前を持つファイルmyFile
  • -execを見つけるのコピー/home/myuser/myFilefindによって返された各結果を上書きする。 {}をそれぞれの検索結果がどこに行くのかと考えてください。
  • ​​3210
  • find
+0

/home/myuser/myFileの後に、{}の順番を2番目の位置に変更するだけで動作します。ありがとう。 –

+0

@LuisAndrésGarcía、ああ、私は誤解しているかもしれません - ファイル '/ home/myuser/myFile'をコピーして、' find'によって見つかった 'myFile'をcwdに上書きしたいのですか? –

+0

あなたは正しいです! :)見つかったファイルのプロパティを一覧表示する別の例は次のとおりです。find -exec ls -l {} ';' –

2

は、パイプは、別の入力に1つのプログラムの出力を送信します。 cpは、端末の入力ストリームから読み取らず、単にコマンドラインで引数を使用します。

パイプの代わりにxargsを使用するか、パイプの代わりにfindexec引数を使用します。

+2

あなたが例を与えることができます、 お願いします?どうもありがとうございました。 –

3

あなたは自分の名前にスペースまたはその他の特殊文字を含むファイルを心配する必要があるかどうかに応じて、これを解決するにはいくつかの方法があります後に別のコマンドを区切るために使用するには、実行します。

ファイル名の中に空白や特殊文字(文字、数字、ダッシュ、アンダースコアのみ)がない場合は、次のような簡単な解決策があります。 $(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では不十分です。たとえば、this questionでは、Bashパラメータの拡張を使用してファイル名を計算したいと考えました。これを行うには、-exec bash -c 'your command'を渡す必要がありますが、{}代入で引用問題が発生します。これを解決するには、(ファイル名に無効である)ヌル文字で区切られた結果を印刷するfindから-print0を使用することができ、かつヌルでパラメータを分割while readループにパイプを:

find . -name myFile -print0 | (while read -d $'\0' f; do 
    cp something "$f" 
    done) 
関連する問題