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に指示するにはどうすればよいですか?
-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