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.

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).


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.