Apa yang Anda tulis mengirim daftar nama file (dan jalur) yang dipisahkan baris baru rm, tetapi rm tidak tahu apa yang harus dilakukan dengan input 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 kerjakan:
find . -name .svn | xargs rm -fr
xargscukup cerdas sehingga hanya akan memberikan argumen rmsebanyak yang dapat diterima. Jadi, jika Anda memiliki sejuta file, ia dapat berjalan rm1.000.000 / 65.000 kali (jika shell Anda dapat menerima 65.002 argumen di baris perintah {65k file +1 untuk rm + 1 untuk -fr}).
Seperti yang ditunjukkan orang dengan mahir, 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 -execformulir pertama memanggil rmuntuk setiap folder yang dihapus, jadi jika Anda memiliki 1.000.000 folder, rmakan dipanggil 1.000.000 kali. Ini tentu kurang ideal. Implementasi yang lebih baru rmmemungkinkan Anda untuk menyimpulkan perintah dengan +indikasi yang rmakan menerima argumen sebanyak mungkin:
find . -name .svn -exec rm -rf {} +
Versi find / xargs terakhir menggunakan print0, yang membuat find menghasilkan output yang digunakan \0sebagai terminator daripada baris baru. Karena sistem POSIX mengizinkan karakter apa pun kecuali \0dalam nama file, ini benar-benar cara paling aman untuk memastikan bahwa argumen diteruskan dengan benar rmatau aplikasi dijalankan.
Selain itu, ada -execdiryang akan mengeksekusi rmdari direktori di mana file itu ditemukan, bukan di direktori dasar dan -depthyang akan mulai lebih dalam.