Saat saya mengetik sesuatu seperti:
find . -name *foo* | ls -lah
ia mengembalikan hasil yang sama dengan ls
perintah biasa , seolah-olah tidak punya input.
Namun:
ls -lah $( find . -name *foo* )
berfungsi dengan baik, tetapi hanya ketika find
perintah memiliki hasil.
Apakah mungkin untuk disalurkan ls
?
bash
command-line
ls
pipe
Lasall
sumber
sumber
Jawaban:
Anda dapat menggunakan
-exec
denganfind
perintah.sumber
find . -name '*foo*' -exec ls -lah {} +
Itu seharusnya bekerja.
sumber
-exec +
(atau-exec \;
).xargs
hanya aman untuk digunakan dengan-0
opsi, yang berarti bahwa Anda harus memberi tahu perintah apa pun yang Anda pipaxargs
untuk membatasi item dengan NULL-byte (\ 0). Denganfind
Anda bisa melakukannya dengan-print0
. xargs's -0 dan find's -print0 tidak standar, tetapi -exec, jadi jika portabilitas menjadi masalah, gunakan find dengan -exec.Coba ini:
sumber
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 1
akan mendapatkan output darifind
diikuti oleh nol. Argumen "-0" untuk xargs mengatakannya untuk mengharapkan input semacam ini, sehingga nama file dengan spasi disalurkan kels
perintah dengan benar.The
xargs
konstruksi dalam beberapa hal lebih baik daripadafind etc -exec ls {} \;
karena semua nama file dikirim kels
sekaligus, jadi jika Anda ingin menyortir mereka semua dengan cap waktu (menggunakanls
), 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)sumber