Tidak perlu pipa, xargs, exec, atau apa pun:
find . -name .svn -delete
Edit: Cuma bercanda, ternyata -delete
memanggil unlinkat()
di bawah terpal, sehingga berperilaku seperti unlink
atau rmdir
dan akan menolak untuk beroperasi pada direktori yang berisi file.
Apa yang Anda tulis mengirimkan daftar nama file (dan jalur) yang dipisahkan baris baru ke rm
, tetapi rm tidak tahu apa yang harus dilakukan dengan masukan itu. Itu hanya mengharapkan parameter baris perintah.
xargs
mengambil input, biasanya dipisahkan oleh baris baru, dan menempatkannya di baris perintah, jadi menambahkan xargs membuat apa yang Anda miliki berfungsi:
find . -name .svn | xargs rm -fr
xargs
cukup cerdas sehingga hanya akan memberikan banyak argumen ke rm
karena dapat menerima. Jadi, jika Anda memiliki sejuta file, itu mungkin menjalankan rm
1.000.000/65.000 kali (jika shell Anda dapat menerima 65.002 argumen pada baris perintah {65k file + 1 for rm + 1 for -fr}).
Seperti yang telah ditunjukkan dengan mahir oleh orang-orang, berikut ini juga berfungsi:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
Dua yang pertama -exec
bentuk keduanya memanggil rm
untuk setiap folder yang dihapus, jadi jika Anda memiliki 1.000.000 folder, rm
akan dipanggil 1.000.000 kali. Ini tentu kurang ideal. Implementasi rm
yang lebih baru memungkinkan Anda untuk menyimpulkan perintah dengan +
menunjukkan bahwa rm
akan menerima argumen sebanyak mungkin:
find . -name .svn -exec rm -rf {} +
Versi find/xargs terakhir menggunakan print0, yang membuat find menghasilkan keluaran yang menggunakan \0
sebagai terminator daripada baris baru. Karena sistem POSIX mengizinkan karakter apa pun kecuali \0
dalam nama file, ini benar-benar cara teraman untuk memastikan bahwa argumen diteruskan dengan benar ke rm
atau aplikasi sedang dijalankan.
Selain itu, ada -execdir
yang akan mengeksekusi rm
dari direktori di mana file itu ditemukan, bukan di direktori dasar dan -depth
yang akan memulai kedalaman terlebih dahulu.
Coba ini:
find . -name .svn -exec rm -rf '{}' \;
Sebelum menjalankan perintah seperti itu, saya sering ingin menjalankan ini terlebih dahulu:
find . -name .svn -exec ls '{}' \;