Cara terbaik menjalankan perintah pada setiap file di pohon direktori

13

Tampaknya ada sejumlah cara untuk melakukan ini termasuk loop di skrip shell, find dan xargs. Yang mana yang terbaik, dan mana yang paling portabel?

Brian Lyttle
sumber

Jawaban:

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

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

find <directory> -exec <command> {} \;
txwikinger
sumber
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.

dhd
sumber
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.

nc3b
sumber
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.

Eugen Anghel
sumber
1

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


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

Berfungsi terbaik untuk saya.

Josh K.
sumber
2
-1 Tidak akan bekerja untuk nama file yang mengandung spasi. Lebih baik gunakan find -print0 | xargs -0.
starblue