Salah satu misi alat ekspor yang saya miliki di aplikasi saya, adalah untuk membersihkan semua .svn
direktori dari pohon direktori aplikasi saya. Saya mencari perintah rekursif di shell Linux yang akan melintasi seluruh pohon dan menghapus .svn
file.
Saya tidak menggunakan ekspor, karena skrip ini akan digunakan untuk beberapa nama file / direktori lain yang tidak terkait dengan SVN. Saya mencoba sesuatu seperti:
find . -name .svn | rm -fr
Itu tidak berhasil ...
Jawaban:
Coba ini:
Sebelum menjalankan perintah seperti itu, saya sering suka menjalankan ini terlebih dahulu:
sumber
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
dilakukan?ls
, saya mendapatkanentries prop-base props text-base tmp
output ...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:xargs
cukup cerdas sehingga hanya akan memberikan argumenrm
sebanyak yang dapat diterima. Jadi, jika Anda memiliki sejuta file, ia dapat berjalanrm
1.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:
Dua
-exec
formulir pertama memanggilrm
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 yang lebih barurm
memungkinkan Anda untuk menyimpulkan perintah dengan+
indikasi yangrm
akan menerima argumen sebanyak mungkin:Versi find / xargs terakhir menggunakan print0, yang membuat find menghasilkan output yang digunakan
\0
sebagai terminator daripada baris baru. Karena sistem POSIX mengizinkan karakter apa pun kecuali\0
dalam nama file, ini benar-benar cara paling aman untuk memastikan bahwa argumen diteruskan dengan benarrm
atau aplikasi dijalankan.Selain itu, ada
-execdir
yang akan mengeksekusirm
dari direktori di mana file itu ditemukan, bukan di direktori dasar dan-depth
yang akan mulai lebih dalam.sumber
Tidak perlu untuk pipa, xarg, exec, atau apa pun:
Sunting: Hanya bercanda, jelas
-delete
memanggil diunlinkat()
bawah tenda, sehingga berperilaku sepertiunlink
ataurmdir
dan akan menolak untuk beroperasi pada direktori yang berisi file.sumber
-delete
tidak akan menyentuh direktori jika berisi file.-force
atau rekursif bendera untuk-delete
predikat, jadi jawaban ini tidak berguna. Dengan demikian, itu kembali ke|xargs rm -rf
, yang kurang jelek untuk mengetik kemudian-exec
dengan penampung yang buruk dan titik koma:-exec rm -rf '{}' \;
.Sudah ada banyak jawaban yang diberikan untuk menghapus direktori .svn. Tetapi saya ingin menambahkan, bahwa Anda dapat menghindari direktori ini dari awal, jika Anda melakukan ekspor alih-alih checkout:
sumber
Jika Anda tidak suka melihat banyak
peringatan, lalu gunakan
-depth
sakelar:sumber
Di Windows, Anda dapat menggunakan skrip registri berikut untuk menambahkan "Hapus Folder SVN" ke menu konteks klik kanan Anda. Jalankan di direktori mana pun yang berisi file-file sial itu.
sumber
Anda hampir memilikinya. Jika Anda ingin meneruskan output dari perintah sebagai parameter ke yang lain, Anda harus menggunakan xargs. Menambahkan
-print0
memastikan skrip dapat menangani jalur dengan spasi putih:sumber
sumber
Sebagai masalah penting, ketika Anda ingin memanfaatkan shell untuk menghapus folder .svn Anda perlu argumen -depth untuk mencegah perintah menemukan memasuki direktori yang baru saja dihapus dan menampilkan pesan kesalahan seperti misalnya
Akibatnya, Anda dapat menggunakan perintah find seperti di bawah ini:
sumber
Coba ini:
Baca lebih lanjut tentang perintah find di developerWorks .
sumber
Atau, jika Anda ingin mengekspor salinan tanpa mengubah copy yang berfungsi, Anda dapat menggunakan rsync:
sumber