find
sangat berguna untuk melakukan tindakan secara selektif pada seluruh pohon.
find . -type f -name ".Apple*" -delete
Di sini, -type f
pastikan itu adalah file, bukan direktori, dan mungkin tidak persis apa yang Anda inginkan karena juga akan melewatkan symlink, soket dan hal-hal lain. Anda dapat menggunakan ! -type d
, yang secara harfiah berarti bukan direktori, tetapi Anda juga dapat menghapus karakter dan memblokir perangkat. Saya sarankan melihat -type
predikat di halaman manual find
.
Untuk melakukannya secara ketat dengan wildcard, Anda memerlukan dukungan shell tingkat lanjut. Bash v4 memiliki globstar
opsi , yang memungkinkan Anda mencocokkan subdirektori dengan menggunakan secara rekursif **
. zsh
dan ksh
juga mendukung pola ini. Dengan itu, Anda bisa melakukannya rm -rf **/.Apple*
. Ini bukan standar POSIX, dan tidak terlalu portabel, jadi saya akan menghindari menggunakannya dalam skrip, tetapi untuk tindakan shell interaktif satu kali, tidak masalah.
find . -type d -name .Apple*
bekerja - ini mencantumkan semua folder. Namun, gagal ketika saya menambahkan-delete
di akhir. Itu hanya kembali dengan ringkasan penggunaan. Ini berjalan di BusyBox v1.1.1. Apakah itu membuat perbedaan?-delete
juga bukan POSIX.**
diperkenalkanzsh
pada awal 90-an. Sekarang (berdasarkan urutan penampilan) juga dalam ksh93, fish, bash dan tcsh.rm -rf **/.Apple*
-delete
tidak berfungsi gunakan-exec rm -f {} +
sebagai gantinya.find
menjadi verbose saat dihapus? Saya kira metode "globstar" akan melakukan ini dengan menambahkan-v
sakelar.Saya mengalami masalah
find
dengan-delete
karena perilaku yang disengajafind
(yaitu menolak untuk menghapus jika path dimulai dengan ./, yang mereka lakukan dalam kasus saya) sebagaimana dinyatakan dalam halaman manualnya:Sebaliknya, saya hanya bisa melakukannya
Untuk kasus Anda, sepertinya mengutip glob (asterisk, *) adalah solusinya, tetapi saya ingin memberikan jawaban saya jika ada orang lain yang memiliki masalah yang sama.
CATATAN: Sebelumnya, jawaban saya adalah melakukan yang berikut, tetapi @Wildcard menunjukkan kelemahan keamanan dalam melakukan itu di komentar.
sumber
xargs
sini.-exec rm -r {} \;
atau, lebih baik,-exec rm -r {} +
akan berhasil juga tanpa gagal pada nama file karakter khusus. Lihat Mengapa mengulang-ulang hasil praktik buruk?mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
di direktori Anda dan kemudian jalankan perintah yang sama lagi, jika Anda tidak yakin ada potensi kehilangan data. Atau, karena pertanyaannya adalah tentang Mac OSmkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
,. ( Peringatan: Anda AKAN menghapus semua file Anda jika Anda melakukan ini. Itu maksud saya.)Apa yang mungkin adalah bahwa tidak ada yang salah dengan perintah rm / find Anda, tetapi pengguna yang Anda masuki sebenarnya tidak memiliki izin menghapus. Gunakan
ls -l
untuk membuat daftar hal-hal dengan izin mereka, dan Anda dapat mengidentifikasi siapa Anda denganid
dangroups
perintah (baik harus tersedia). Jika Anda adalah "pengguna yang salah" untuk melakukan ini, Anda perlu mengubah izin / kepemilikan file, atau beralih ke pengguna lain.sumber
Mencoba:
sumber
dotglob
tidak berguna di sini. Lihat halaman ini untuk contoh tentang apa yang dotglob lakukan.Perintah sederhana:
Semoga berhasil!
sumber