Saya mengeluarkan perintah berikut untuk menemukan direktori .svn:
find . -name ".svn"
Itu memberi saya hasil berikut:
./toto/.svn
./toto/titi/.svn
./toto/tata/.svn
Bagaimana saya bisa memproses semua baris ini dengan rm -fr
tujuan untuk menghapus direktori dan isinya?
find
rm
subversion
Arnaud
sumber
sumber
-delete
opsi.-exec rm -r "{}" \;
di akhir pencarian - berhati-hatilah saat menggunakanrm -r
! :)-name ".svn"
hanya cocok dengan.svn
direktori itu sendiri dan bukan file yang terletak di.svn
direktori.-exec
dengan dikutip"{}"
).Jawaban:
Find dapat mengeksekusi argumen dengan
-exec
opsi untuk setiap kecocokan yang ditemukannya. Ini adalah mekanisme yang disarankan karena Anda dapat menangani jalur dengan spasi / baris baru dan karakter lain di dalamnya dengan benar. Anda harus menghapus isi direktori sebelum Anda dapat menghapus direktori itu sendiri, jadi gunakan-r
denganrm
perintah untuk mencapai ini.Sebagai contoh, Anda dapat menerbitkan:
Anda juga dapat memberi tahu find untuk hanya menemukan direktori bernama .svn dengan menambahkan tanda
-type d
centang:Peringatan Gunakan
rm -r
dengan hati-hati menghapus folder dan semua isinya.Jika Anda ingin menghapus hanya direktori kosong dan juga direktori yang hanya berisi direktori kosong, temukan dapat melakukannya sendiri dengan
-delete
dan-empty
:sumber
-type
setelah-name
dalam menemukan perintah, karena panggilanstat
untuk mendapatkan jenis itu mahal. Saya baru saja mencobanya sendiri di banyak file, dan tampaknya benar: menjalankanfind . -name 'foo' -type d
mengambil 19 detik, sementarafind . -type d -name 'foo'
mengambil 32 detik. Jadi sekitar 50% lebih lama waktu untuk berjalan-type
terlebih dahulu.find
ingin melihat di folder itu untuk pertandingan lain, sementara itu menghapus folder pada saat bersamaan. ~ Aku belum tahu bagaimana memperbaikinya. ~ Memperbaiki kotor:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
-depth
argumennya akan memperbaiki ini:find . -depth -name ".svn" -type d -exec rm -r "{}" \;
Ini adalah portable yang masih lebih cepat daripada cara menjawab yang diterima.
Menggunakan
+
bukannya titik koma sebagaifind
terminator perintah mengoptimalkan penggunaan CPU. Itu bisa menjadi signifikan jika Anda memiliki banyak.svn
subdirektori:Perhatikan juga bahwa Anda tidak pernah 1 perlu mengutip kurung kurawal di sini.
1 Kecuali Anda menggunakan
fish
shell.sumber
+
tidak mengurangi penggunaan CPU, Menggunakan;
tidak menyebabkan kesalahan perintah terlalu lama.Asumsikan Anda menggunakan gnu find , Anda dapat menggunakan
-delete
opsi:yang lebih mudah diingat.
sumber
Di komputer saya ketika saya menggunakan:
Direktori dihapus tetapi saya mendapatkan kesalahan:
untuk setiap direktori.
Direktori saya tidak kosong, jadi opsi -delete tidak akan berfungsi untuk saya. Saya menemukan alasan perilaku ini di sini :
Saya menggunakan ini sebagai gantinya:
Ingatlah bahwa find masih akan mencoba untuk kembali ke direktori bernama dirname, yang sebenarnya tidak perlu dan akan membutuhkan waktu tambahan. Bergantung pada struktur direktori Anda, Anda mungkin dapat mengatasinya dengan
--depth
opsi find. Selain itu, jika Anda memiliki struktur direktori seperti dirname / foo / dirname Anda akan mendapatkan kesalahan "Tidak ada file atau direktori" dari rm. Untuk menekan kesalahan, Anda dapat mengarahkan stderr ke / dev / null atau menggunakan-f
flag (force) dengan rm.sumber
find . -name "to-delete" -print0 | xargs -r0 -- rm -r
adalah versi anti gagal yang tidak menabrak ruang-prune
.-prune
untuk menghindari kesalahan "Tidak ada file atau direktori".Cara yang lebih cepat untuk melakukan ini adalah:
Jika Anda memiliki ".svn" di dalam yang lain ".svn".
sumber
Solusi spesifik Bash:
sumber
bash: /bin/rm: Argument list too long
Saya telah menemukan bahwa
-delete
tindakannya bekerja dengan baik dengan-path
tes. Sebagai contoh, berikut ini harus bekerja pada masalah poster asli:sumber
-delete
tersirat-depth
, dan itu pasti menghapus direktori tidak kosong di sistem saya.