GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana menghapus semua direktori .svn dari direktori aplikasi saya

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

Linux
  1. Cara menghapus aria2 dari Ubuntu

  2. Bagaimana cara mengulang direktori di Linux?

  3. Bagaimana cara mengabaikan direktori/file di Subversion?

  1. Bagaimana cara menghapus iso 9660 dari USB?

  2. Bagaimana cara menghapus VS Code &pengaturan dari Ubuntu?

  3. Bagaimana cara menemukan semua file dan direktori yang dapat ditulis oleh pengguna tertentu?

  1. Cara Menemukan File Di Linux Di Semua Direktori Secara Rekursif

  2. Cara mendaftar semua file dan direktori secara rekursif

  3. Bagaimana cara saya mendaftar secara rekursif semua direktori di suatu lokasi, luasnya terlebih dahulu?