Ini tidak berfungsi. Bisakah ini dilakukan dalam pencarian? Atau apakah saya perlu xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
sumber
Ini tidak berfungsi. Bisakah ini dilakukan dalam pencarian? Atau apakah saya perlu xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
Tugas menafsirkan simbol pipa sebagai instruksi untuk menjalankan banyak proses dan menyalurkan output dari satu proses ke input proses lain adalah tanggung jawab shell (/ bin / sh atau yang setara).
Dalam contoh Anda, Anda dapat memilih untuk menggunakan shell tingkat atas untuk melakukan pemipaan seperti:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
Dalam hal efisiensi, hasil ini membutuhkan satu doa penemuan, banyak doa zcat, dan satu doa agrep.
Ini hanya akan menghasilkan satu proses agrep tunggal yang akan memproses semua output yang dihasilkan oleh banyak doa zcat.
Jika karena alasan tertentu ingin memohon agrep beberapa kali, Anda dapat melakukan:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
Ini membangun daftar perintah menggunakan pipa untuk mengeksekusi, kemudian mengirimkan ini ke shell baru untuk benar-benar dieksekusi. (Menghilangkan "| sh" terakhir adalah cara yang bagus untuk men-debug atau menjalankan perintah-perintah kering seperti ini.)
Dalam hal efisiensi, hasil ini membutuhkan satu doa penemuan, satu doa sh, banyak doa zcat dan banyak doa agrep.
Solusi paling efisien dalam hal jumlah permintaan perintah adalah saran dari Paul Tomblin:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
... yang meminta satu doa penemuan, satu doa xargs, beberapa doa zcat dan satu doa agrep.
-exec sh -c "… | … " \;
.solusinya mudah: jalankan via sh
sumber
-c
opsi. Kalau tidak, Anda akan mendapatkanNo such file or directory
pesan kesalahan yang membingungkan .find -type f -name '*.mdds' -exec sh -c "echo {} | sed -e 's/_[0-9]\+//g' | xargs mv {}" \;
sumber
Anda juga dapat mem-pipe ke
while
loop yang dapat melakukan banyak tindakan pada file yang ditemukanfind
. Jadi di sini adalah satu untuk mencari dijar
arsip untuk file kelas java yang diberikan dalam folder dengan distrojar
file yang besartitik kuncinya adalah bahwa
while
loop berisi beberapa perintah yang merujuk nama file yang diteruskan dipisahkan oleh tanda koma dan perintah-perintah ini dapat termasuk pipa. Jadi dalam contoh itu saya gema nama file yang cocok kemudian daftar apa yang ada di pemfilteran arsip untuk nama kelas yang diberikan. Outputnya terlihat seperti:/usr/lib/eclipse/plugins/org.eclipse.core.contenttype.source_3.4.1.R35x_v20090826-0451.jar /usr/lib/eclipse/plugins/org.eclipse.core.databinding.observable_1.2.0.M20090902-0800 .jar org / eclipse / core / databinding / observable / list / IObservableList .class /usr/lib/eclipse/plugins/org.eclipse.search.source_3.5.1.r351_v20090708-0800.jar / usr / lib / eclipse / plugins / org.eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar /usr/lib/eclipse/plugins/org.eclipse.cvs.source_1.0.400.v201002111343.jar / usr / lib / eclipse / plugins / org.eclipse.help.appserver_3.1.400.v20090429_1800.jar
di bash shell saya (xubuntu10.04 / xfce) itu benar-benar membuat nama kelas yang cocok dicetak tebal sebagai
fgrep
highlight pada string yang cocok; ini membuatnya sangat mudah untuk memindai daftar ratusanjar
file yang dicari dan dengan mudah melihat kecocokan.pada windows Anda dapat melakukan hal yang sama dengan:
perhatikan bahwa pada windows pemisah perintah adalah '&' tidak ';' dan bahwa '@' menahan gema perintah untuk memberikan output yang rapi seperti linux find output di atas; meskipun
findstr
tidak membuat string yang cocok jadi Anda harus melihat sedikit lebih dekat pada output untuk melihat nama kelas yang cocok. Ternyata perintah windows 'untuk' tahu beberapa trik seperti perulangan melalui file teks ...Nikmati
sumber
Saya menemukan bahwa menjalankan perintah string shell (sh -c) berfungsi paling baik, misalnya:
sumber
Jika Anda mencari alternatif sederhana, ini bisa dilakukan menggunakan loop:
atau, bentuk yang lebih umum dan mudah dipahami:
dan ganti {} dengan $ i di YOUR_EXEC_COMMAND_AND_PIPES
sumber