Saya mencoba menjalankan grep terhadap daftar beberapa ratus file:
$ head -n 3 <(cat files.txt)
admin.php
ajax/accept.php
ajax/add_note.php
Namun, meskipun saya mencari string yang saya tahu ditemukan dalam file, berikut ini tidak mencari file:
$ grep -i 'foo' <(cat files.txt)
$ grep -i 'foo' admin.php
The foo was found
Saya kenal dengan -f
flag yang akan membaca pola dari file. Tapi bagaimana cara membaca file input ?
Saya telah mempertimbangkan solusi yang mengerikan dari menyalin file ke direktori sementara karena cp
tampaknya mendukung <(cat files.txt)
format, dan dari sana mengambil file. Shirley ada cara yang lebih baik.
sumber
while
bisa menerima baris file.txt seperti itu.while
tidak persis menerima baris dari file,read
melakukan itu;while
biarkan kami melakukannya dalam satu lingkaran. Loop berakhir ketikaread
gagal (yaitu mengembalikan kode pengembalian non-nol), biasanya karena Akhir File tercapai.IFS= read -r filename
,read filename
adalah sesuatu yang lain.-H
adalah ekstensi GNU. Anda melewatkan beberapa--
.dengan asumsi file kosong atau baris baru dibatasi (di mana tanda kutip atau garis miring terbalik dapat digunakan untuk menghindari pemisah tersebut). Dengan GNU
xargs
Anda dapat menentukan pembatas dengan-d
(yang kemudian menonaktifkan penanganan kutipan).dengan asumsi file terpisah ruang, tab atau baris baru (tidak ada cara untuk menghindarinya meskipun Anda dapat memilih pemisah yang berbeda dengan menugaskannya
IFS
). Yang itu akan gagal jika daftar file terlalu besar pada kebanyakan sistem.Mereka juga berasumsi bahwa tidak ada file yang dipanggil
-
.sumber
$(< file)
daripada$(cat file)
, setidaknya dalambash
danzsh
.Untuk membaca daftar nama file dari stdin dapat Anda gunakan
xargs
. Misalnya,Secara default,
xargs
membaca item dari input standar, dibatasi oleh kosong. The-d'\n'
mengatakan itu untuk menggunakan baris baru sebagai pembatas argumen, sehingga dapat menangani nama file yang berisi kosong. (Seperti yang ditunjukkan Stéphane Chazelas, itu adalah ekstensi GNU). Namun, itu tidak akan mengatasi nama file yang mengandung baris baru; kita akan membutuhkan pendekatan yang sedikit lebih rumit untuk mengatasinya.FWIW, pendekatan ini agak lebih cepat daripada
while read
loop, karenaread
perintah bash sangat lambat - ia membaca karakter data-nya dengan karakter, sedangkanxargs
membaca inputnya lebih efisien. Juga,xargs
hanya menjalankangrep
perintah sebanyak yang diperlukan, dengan setiap doa menerima beberapa nama file, dan itu lebih efisien daripada memanggil secaragrep
individual untuk setiap nama file.Lihat halaman manual xargs dan halaman info xargs untuk perincian lebih lanjut.
sumber
xargs
dapat membaca item dari file (sepertifiles.txt
daftar Anda ) dengan opsi itu:Jadi ini harus bekerja juga:
atau untuk spasi dalam nama file
sumber
Anda juga dapat melakukan for for tetapi contoh Orion adalah yang paling sederhana:
(Untuk setiap file yang terdaftar di files.txt, jalankan perintah grep di atasnya.)
sumber