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 '{}' \;