Bekerja dengan xenserver, dan saya ingin melakukan perintah pada setiap file yang ada di direktori, mengeluarkan beberapa hal dari output perintah dan menambahkannya dalam file.
Saya jelas pada perintah yang ingin saya gunakan dan bagaimana mengeluarkan string yang diperlukan.
Tapi yang saya tidak jelas adalah bagaimana saya menjalankan perintah ini pada setiap file, pergi ke yang berikutnya, sampai tidak ada lagi file yang ditemukan.
grep $PATTERN *.cpp *.h
. Jika Anda memerlukan aturan yang lebih spesifik untuk file apa yang harus dipahami, gunakanfind
perintah (periksa jawaban Rob).grep -r x .
hasil datang dari semua file dari semua ekstensi. Jika saya lari makagrep -r x *.scss
saya tidak mendapat hasil.*.scss
file di direktori saat ini tetapi di suatu tempat yang lebih dalam di subdirs sehingga grep tidak melihat semua file yang Anda inginkan. Anda harus menggunakan--include
opsi untuk memberi tahu grep agar mencari file yang cocok dengan pola tertentu secara rekursif:grep -r x --include '*.scss' .
(perhatikan tanda kutip, mereka mencegah polanya tidak diperluas oleh shell). Atau gunakan sajafind
(lihat jawaban Rob).Di Linux, saya biasanya menggunakan perintah ini untuk secara grep menerima teks tertentu dalam suatu dir
dimana,
r = rekursif yaitu, mencari subdirektori dalam direktori saat ini
n = untuk mencetak nomor baris ke stdout
i = pencarian case-sensitive
sumber
Gunakan temukan. Serius, ini adalah cara terbaik karena Anda dapat benar-benar melihat file apa yang beroperasi:
Catatan, -H adalah spesifik mac, ini menunjukkan nama file dalam hasil.
sumber
xargs
daripada menggunakan-exec
ini akan jauh lebih cepat, karena-exec
memunculkan proses baru untuk setiap grep, dan overhead menjadi signifikan dengan sejumlah besar file. Peringatan standar tentang spasi dalam nama file berlaku untukxargs
.xargs
sintaksisnya.find . -iname "*.sql" -print0 | xargs -0 grep "slow"
Untuk mencari di semua sub-direktori, tetapi hanya dalam tipe file tertentu , gunakan grep with
--include
.Misalnya, mencari secara rekursif di direktori saat ini, untuk teks dalam * .yml dan * .yaml:
sumber
Jika Anda ingin melakukan banyak perintah, Anda dapat menggunakan:
sumber