Bagaimana saya bisa mengarahkan input pipa ke perintah ls?


20

Saat saya mengetik sesuatu seperti:

find . -name *foo* | ls -lah

ia mengembalikan hasil yang sama dengan lsperintah biasa , seolah-olah tidak punya input.

Namun:

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

berfungsi dengan baik, tetapi hanya ketika findperintah memiliki hasil.

Apakah mungkin untuk disalurkan ls?


Anda perlu menentukan apakah Anda ingin file di dalam setiap hasil pencarian, atau Anda ingin hasil pencarian secara langsung. Jika yang terakhir, maka jawaban u / Dennis adalah jawaban yang benar.
rmutalik

Jawaban:


27

Anda dapat menggunakan -execdengan findperintah.

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

Terima kasih atas solusinya. Tidak ada pipa tetapi metode yang elegan. Jika tidak ditemukan hasil apa pun dengan 'temukan', itu tidak menampilkan apa pun (apa yang sebenarnya baik).
Lasall

7
Cara yang sedikit lebih baik:find . -name '*foo*' -exec ls -lah {} +
jlliagre

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

Itu seharusnya bekerja.


1
Terima kasih atas solusinya. Tetapi bagaimana saya bisa menangani ruang putih?
Lasall

2
@ Secara keseluruhan, cara yang disukai adalah menggunakan find's -exec +(atau -exec \;). xargshanya aman untuk digunakan dengan -0opsi, yang berarti bahwa Anda harus memberi tahu perintah apa pun yang Anda pipa xargsuntuk membatasi item dengan NULL-byte (\ 0). Dengan findAnda bisa melakukannya dengan -print0. xargs's -0 dan find's -print0 tidak standar, tetapi -exec, jadi jika portabilitas menjadi masalah, gunakan find dengan -exec.
geirha


3

Gunakan ini: (ls dapat mengurutkan, bekerja dengan nama file dengan spasi atau karakter yang tidak biasa)

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

"-print0" berarti bahwa nama file seperti file foo 1akan mendapatkan output dari finddiikuti oleh nol. Argumen "-0" untuk xargs mengatakannya untuk mengharapkan input semacam ini, sehingga nama file dengan spasi disalurkan ke lsperintah dengan benar.

The xargskonstruksi dalam beberapa hal lebih baik daripada find etc -exec ls {} \;karena semua nama file dikirim ke lssekaligus, jadi jika Anda ingin menyortir mereka semua dengan cap waktu (menggunakan ls), sesuatu seperti karya ini:

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

Pada sistem NetBSD, "-printx" juga merupakan opsi (ini sepertinya argumen yang berguna bagi saya, tetapi apa pun, kami memiliki xargs -0 dan tidak apa-apa):

find . -name *foo* -printx | xargs ls -lah (bukan untuk Ubuntu)


Ini melakukan trik bagi saya untuk dapat benar-benar menggunakan fungsi penyortiran ls, bagi mereka yang mencoba melakukan ini.
Harry Mustoe-Playfair
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.