Cara terbaik menjalankan perintah pada setiap file di pohon direktori


Jawaban:


13
find . -exec <command> {} \;

untuk direktori saat ini sebagai root dari pohon atau secara umum:

find <directory> -exec <command> {} \;

4
pada beberapa sistem temukan dont punya opsi -exec sana Anda dapat menggunakan find. | xargs <Command>
Hemant

4
Memang, dan jika Anda perlu memfilter berdasarkan sesuatu, coba -name "*.c"atau misalnya -type duntuk direktori ...

Temukan dapat melakukan hal-hal yang sangat rumit - Anda mungkin ingin memeriksa halaman manual - unixhelp.ed.ac.uk/CGI/man-cgi?find - untuk daftar opsi lengkap.
Lucas Jones

Anda mungkin juga ingin berhati-hati terhadap nama file dengan spasi, yang dapat merusak pendekatan -exec dan xargs. Lihat tinyurl.com/ygvgmw5
Shawn Chin

Jika memungkinkan, gunakan find ... | xargs ...idiom, itu memproses file dalam batch, dan ini biasanya akan lebih cepat (lebih sedikit proses diluncurkan).
vonbrand

5

Gunakan -print0opsi untuk menemukan dan -0opsi untuk xargsjika Anda memiliki nama file atau direktori dengan spasi:

find {dir} -print0 | xargs -0r {command}

The -print0pilihan untuk menemukan print nama file sebagai NUL-separated daripada spasi daftar dipisahkan, sedangkan -0pilihan untuk xargsmenginstruksikan untuk istirahat masukan pada NULdaripada spasi. Karena NULadalah salah satu karakter yang tidak diperbolehkan dalam nama file Unix, tidak ada cara untuk itu dikira sebagai bagian dari nama file.

The -rpilihan adalah ada sehingga xargstidak akan memberikan Anda sebuah kesalahan jika tidak memiliki masukan.


3

Jika portabilitas adalah masalah saya akan tinggal jauh dari cara-cara khusus untuk melakukannya (ada banyak orang menggunakan banyak shell yang berbeda, tetapi secara umum menemukan dan xargs adalah alat yang benar-benar dasar yang tidak ada yang berani berubah secara radikal) .

Menggunakan argumen dasar find dan xargs akan memberi Anda solusi yang lebih portabel.


2

Jika pengelompokan argumen bersama dapat diterima, temukan | xargs mungkin akan memberikan kinerja yang lebih baik, karena ia akan mengeksekusi perintah jauh lebih sedikit daripada menemukan -exec. Jika Anda ingin mengeksekusi perintah setiap kali untuk setiap file atau mengeksekusi di subdirektori file Anda mungkin harus menggunakan find -exec atau -execdir.

Sebagai aturan, lebih baik untuk menghindari loop khusus shell; find & xargs cukup untuk sebagian besar skenario.


1

Pastikan versi perintah yang Anda gunakan belum memiliki flag untuk operasi rekursif. :)


0
find [args] -print | xargs {command}

Berfungsi terbaik untuk saya.


2
-1 Tidak akan bekerja untuk nama file yang mengandung spasi. Lebih baik gunakan find -print0 | xargs -0.
starblue
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.