-lフラグをxargsおよびgrepと組み合わせて渡したときに、lsが機能しないのはなぜですか?
$ ls -rt | xargs grep xyz
動作しますが:
$ ls -lrt | xargs grep xyz
grep: invalid option -- '-'
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
の出力ls -l
は次のようになるためです。
-rw-r--r-- 1 root root 1491872 2012-11-22 03:07 Xvfb_screen0
これを xargs( ls -l | xargs grep xyz
) にパイプすると、grep コマンドが
grep xyz -rw-r--r-- 1 root root 1491872 2012-11-22 03:07 Xvfb_screen0
そして、それは意味がありません。
編集
ここで @vladr コメントに回答するには、コメント ボックスよりも書式設定が優れているためです。xargs の入力からの空白で区切られた各テキストは、実行されたコマンドに新しいパラメーターとして渡されます。
$ ls -l
total 4
-rwxrwxr-x 1 carlos carlos 18 2012-11-22 15:17 foo
$ cat foo
#!/bin/sh
echo $#
$ ls -l | xargs ./foo
10
xargs
区切り文字をに設定することで、あなたが言うように振る舞うことができます\n
:
$ ls -l | xargs -d '\n' ./foo
2
あなたの質問に答えるには、具体的には を使用しますls -lrt | xargs grep xyz --
( に注意してください。これは、その後に表示される--
すべてのダッシュが、オプション フラグとしてではなく、文字どおりに解釈されることを意味します。コマンドの展開先については、 @CarlosCampderrós の回答を参照してください) 。使用されているように、有用なものを達成する可能性は低いため、最初から正しいセットアップを行ってください。-
xyz
すべてのファイルを時系列の逆順に grep しようとしている可能性が高いです。その場合は、 ( dash-ellではなくls -1rt | xargs grep xyz --
、 dash-one に注意してください。)は、この場合は完全にオプションです (1 つまたは複数のファイルの名前が dash で始まると予想される場合を除きます)。-1
-l
--
-