パイプ入力をlsコマンドに転送するにはどうすればよいですか?


20

次のように入力すると:

find . -name *foo* | ls -lah

ls入力がないかのように、単純なコマンドと同じ結果を返します。

しかしながら:

ls -lah $( find . -name *foo* )

うまく機能しますが、findコマンドに結果がある場合のみです。

パイプすることは可能lsですか?


各検索結果内のファイルをlsするか、検索結果を直接lsするかを指定する必要があります。後者の場合、u / Dennisの答えが正しい答えです。
rmutalik

回答:


27

-execwith findコマンドで使用できます。

find . -name '*foo*' -exec ls -lah {} \;

解決していただきありがとうございます。パイプはありませんが、エレガントな方法です。'find'で結果が見つからない場合、何も表示されません(実際には良いことです)。
ラサル

7
少し良い方法:find . -name '*foo*' -exec ls -lah {} +
jlliagre

20
find . -name *foo* | xargs -r ls -lah

うまくいくはずです。


1
その解決策をありがとう。しかし、どのように空白を処理できますか?
ラサル

2
@Lasallの好ましい方法は、find -exec +(または-exec \;)を使用することです。xargsこの-0オプションで使用するのは安全です。つまり、パイプするコマンドxargsをNULLバイト(\ 0)で区切るために指定する必要があります。でfindあなたはそれを行うことができます-print0。xargsの-0およびfindの-print0は標準ではありませんが、-execは標準であるため、移植性が問題になる場合は、-execでfindを使用してください。
ガイラ


3

これを使用します:(lsは並べ替えることができ、スペースまたは異常な文字を含むファイル名で動作します)

find . -name *foo* -print0 | xargs -0 ls -lah

「-print0」は、などのファイル名の後にnullが続くfile foo 1出力を取得することを意味しますfind。xargsの「-0」引数は、この種の入力を想定しているため、スペースを含むファイル名はlsコマンドに正しくパイプされます。

xargs建設は、より良いよりも、いくつかの方法であるfind etc -exec ls {} \;ファイル名のすべてがに送信されますので、lsあなたは、タイムスタンプ(使用して、それらすべてをソートしたいのであれば、一度ls、)この作品のようなものを:

find . -iname *pdf -print0 | xargs -0 ls -ltr

NetBSDシステムでは、「-printx」もオプションです(これは私にとって有用な議論のようですが、xargs -0があり、それでかまいません)。

find . -name *foo* -printx | xargs ls -lah (Ubuntu用ではありません)


これは、私がlsのソート機能を実際に使用できるようにするためのトリックでした。
ハリーマスタウプレイフェア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.