私の理解では、以下はまったく同じ意味です。
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
-Iオプションが指定されていない場合、デフォルトは-I {}です。
現在のディレクトリ内のすべてのファイルを一覧表示し、file
それぞれに対してコマンドを実行します。名前にスペースが含まれているものもあります。しかし、違いに気づきました。下記参照:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
-I {}を明示的に指定すると、ファイル名の空白は期待どおりに扱われます。
3
「-Iオプションが指定されていない場合、デフォルトは-I {}」-これは少なくともGNU xargsでは正しくありません。
—
jjlin
私は自分の間違いを理解しています。
—
foresightyj
xargs file
またはを指定する必要がありますxargs -I{} file {}
。するべきではありませんxargs file {}
。-I {}を明示的に指定すると、bashはそれをとして扱いfile "Hello World"
ます。-I {}がなければ、として扱われfile Hello World
ます。
(1)この議論は、シェル(bash)とはほとんど関係ありません。(2)の
—
スコット
-1
オプションを知っているのは良いことですが、ls
の出力がls
ファイルまたはパイプの場合はデフォルトでオンになっているため、ここでは必要ありません。(3)-I
非推奨の-i
(小文字のI
)オプションと混同しています。 -ifoo
はと同等ですが-Ifoo
、plainはと-i
同等-I{}
です。ただし、を使用します-I{}
。(4)自分のやりたいことを本当にやりたいのなら、単に言ってみませんfile *
か?
@Scott私の元々の意図は `findを書くことでした。-name "* .mov" | xargs -I {} file {} `すべてのmovファイルを再帰的に見つけて実行
—
foresightyj
file
します。しかし、私はを使用してより簡単な例を思いつきましたls
。あなたが正しいです。そのためにfile *
は、最高です。
見つけます
—
クリスチャンシウピトゥ
-exec
。