web-dev-qa-db-ja.com

選択する引数をxargsに指示する方法は?

Xargsが最初のコマンド出力を2番目のコマンドの引数にリダイレクトし、出力のどの要素のどの引数を選択するか選択できない場合、たとえば次のように1つの方法しかありません。

ls | xargs file  # there are as many arguments as files in the listing,
                 # but the user does not have too choose himself

選択の必要がある場合:

ls | xargs file | grep image | xargs mv.....   # here the user has to 
                                               # deal  with two arguments of mv, first for source second for destination, suppose your destination argument is set already by yourself and you have to put the output into the source argument. 

最初のコマンドの標準出力を2番目のコマンドで選択した引数にリダイレクトするようにxargsに指示するにはどうすればよいですか?

enter image description here

12
Abdul Al Hazred

-Iを使用して、xargsに渡される引数の各値で置き換えられるプレースホルダーを定義できます。例えば、

ls -1 | xargs -I '{}' echo '{}'

echoの出力からlsを1行に1回呼び出します。 '{}'が使用されていることがよくあります。これは、おそらくfindのプレースホルダーと同じだからです。

あなたの場合、一致するファイル名を抽出するためにfileの出力を前処理する必要もあります。そこにはgrepがあるので、awkを使用して両方を実行し、fileの呼び出しも単純化できます。

file * | awk -F: '/image/ { print $1 }' | xargs -I '{}' mv '{}' destination

GNU mvがある場合、-tを使用して複数のソースファイルを渡すことができます。

file * | awk -F: '/image/ { print $1 }' | xargs mv -t destination
27
Stephen Kitt