Ini tidak berfungsi. Bisakah ini dilakukan dalam pencarian? Atau apakah saya perlu xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
Ini tidak berfungsi. Bisakah ini dilakukan dalam pencarian? Atau apakah saya perlu xargs?
find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
Jawaban:
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
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
-c
opsi. Kalau tidak, Anda akan mendapatkan No 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 {}" \;
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
Anda juga dapat mem-pipe ke while
loop yang dapat melakukan banyak tindakan pada file yang ditemukan find
. Jadi di sini adalah satu untuk mencari di jar
arsip untuk file kelas java yang diberikan dalam folder dengan distro jar
file yang besar
find /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done
titik 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 ratusan jar
file yang dicari dan dengan mudah melihat kecocokan.
pada windows Anda dapat melakukan hal yang sama dengan:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList
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
Saya menemukan bahwa menjalankan perintah string shell (sh -c) berfungsi paling baik, misalnya:
find -name 'file_*' -follow -type f -exec bash -c "zcat \"{}\" | agrep -dEOE 'grep'" \;
Jika Anda mencari alternatif sederhana, ini bisa dilakukan menggunakan loop:
for i in $(find -name 'file_*' -follow -type f);do zcat $i | agrep -dEOE 'grep');done
atau, bentuk yang lebih umum dan mudah dipahami:
for i in $(YOUR_FIND_COMMAND);do YOUR_EXEC_COMMAND_AND_PIPES );done
dan ganti {} dengan $ i di YOUR_EXEC_COMMAND_AND_PIPES