GNU/Linux >> Linux の 問題 >  >> Linux

別のコマンドのパラメーターとしての Linux コマンド出力

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

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 {} {} を定義 プレースホルダーとして、実行するコマンドと競合する場合は、代わりに別のプレースホルダーを使用できます。


Linux
  1. Linuxコマンドの出力を変数に割り当てる方法

  2. Linuxでコマンド出力をファイルに保存する方法

  3. Linux find コマンド - 進行状況を表示

  1. Linuxmvコマンド

  2. Linuxduコマンド

  3. Linux 時間コマンドの例

  1. Linuxのfindコマンドの25の簡単な例

  2. Linux での find コマンドの例

  3. Linux での tee コマンドの例