Perintah Linux: temukan file dan jalankan perintah pada mereka

16

Bagaimana saya mengatur untuk menemukan semua file dalam direktori dan subdirektori dan menjalankan perintah pada mereka?

Sebagai contoh,

find . -type f -name "*.txt" 

menemukan semua file txt dan:

find . -type f -name "*.txt" | gedit

mengirimkannya ke gedit, tetapi di dalam file teks. Saya ingin gedit membuka semua file teks.

xyz
sumber

Jawaban:

22

Anda dapat menggunakan -execbendera untuk menjalankan perintah pada setiap file yang cocok:

$ find ./ -type f -name "*.txt" -exec gedit "{}" \;

Sintaksis

Sintaksnya agak aneh (lihat -exec command ;di halaman manual untuk lebih lanjut):

The string `{}' is replaced by the current file name being processed

Anda mungkin juga ingin mempertimbangkan -execdir, yang akan melakukan hal yang sama, tetapi mengeksekusi perintah dari subdirektori yang berisi file yang cocok (ini umumnya lebih disukai).

David Cain
sumber
1
Terima kasih. Saya melihat itu bekerja. Tapi apa artinya bagian akhir ("{}" \ :)? jalankan daftar?
1
Yang {}berdiri untuk nama file saat ini, dan titik koma hanya mengakhiri perintah. Garis miring terbalik dan tanda kutip sekitarnya hanya untuk mencegah ekspansi shell.
David Cain
5

find . -type f -name "*.txt" -print0 | xargs -0 gedit

Tidak dalam daftar
sumber
Terima kasih. Saya melihat itu bekerja. Tapi apa arti -print0 | xargs -0 artinya bagian?
1
@xyz, Anda dapat membaca tentang bendera setiap perintah UNIX menggunakan halaman manual. Coba man findatau man xargs, kemudian /untuk mencari bendera yang diberikan. Dokumentasinya cukup bagus, harus menjawab pertanyaan Anda.
David Cain
1
-print0mencetak karakter NULL setelah setiap entri, -0mengharapkan entri dipisahkan oleh karakter NULL. Ini adalah cara teraman untuk menangani nama yang rumit.
Notinlist
Dan bukankah ini sedikit aneh bahwa sintaksnya bukan gedit xargs -0 bukannya xargs -0 gedit. Saya melihat bahwa yang pertama tidak bekerja, tetapi gagal untuk melihat mengapa.
3
xargs lebih disukai daripada -exec karena alasan kinerja karena xargs dapat "menumpuk" sejumlah argumen sebelum meneruskannya ke gedit. Jika seseorang perlu menjalankan gedit terhadap setiap file satu per satu, ganti '... -print0 | xargs -0 gedit 'dengan' ... -print0 | xargs -0 -i gedit {} 'xargs adalah salah satu dari perintah-perintah seperti find dan layar yang Anda tidak pernah tahu bagaimana Anda dapat hidup tanpa satu tahun setelah Anda mempelajarinya.
arclight