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.