6

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

しかし、それらはより複雑なようです。

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

ここで何が問題なのですか?:

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

ありがとう

4

3 に答える 3

19

これはあなたが望むものです:

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

これの内訳/説明:

  • find:findコマンドを呼び出す
  • .:現在の作業ディレクトリから検索を開始します。
  • 深度フラグが指定されていないため、これによりすべてのサブフォルダーが再帰的に検索されます
  • -name myFile:明示的な名前のファイルを検索するmyFile
  • -exec:検索結果については、それらを使用して追加のコマンドを実行します
  • cp /home/myuser/myFile {}/home/myuser/myFile:に返される各結果を上書きするためにコピーしますfind; {}各検索結果がどこに行くかと考えてください。
  • ';':後に実行されるさまざまなコマンドを分離するために使用されますfind
于 2012-11-05T16:42:19.880 に答える
7

名前にスペースやその他の特殊文字が含まれるファイルについて心配する必要があるかどうかに応じて、これを解決する方法がいくつかあります。

ファイル名にスペースや特殊文字 (文字、数字、ダッシュ、およびアンダースコアのみで構成されている) が含まれていない場合は、次の簡単な解決策が有効です。を使用$(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'で引用符の問題が発生します。{}これを解決するには、-print0fromを使用しfindて null 文字 (ファイル名では無効) で区切られた結果を出力し、それを null でwhile readパラメーターを分割するループにパイプします。

find . -name myFile -print0 | (while read -d $'\0' f; do
    cp something "$f"
  done)
于 2012-11-05T16:45:05.847 に答える
5

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

xargsパイプの代わりにパイプまたはfindexec引数で使用したい。

find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}

注: optionは、実行するコマンドと競合する場合に別のプレースホルダーを代わりに使用できるプレースホルダーとして-I {}定義します。{}

于 2012-11-05T16:37:39.157 に答える