Saya mencoba menghapus banyak file di direktori tertentu (di Mac OS X menggunakan Terminal)
ls | grep \([1-9]\) | xargs rm
harus melakukan trik, tetapi tidak. Saya mencoba untuk menghapus file apa pun dengan satu digit dalam tanda kurung di nama file (duplikat diunduh dari web), tetapi akhirnya melakukan sesuatu seperti ini:
> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory
karena tidak menafsirkan ruang yang benar. Itu harus menghapus "520syllabus2010 (3) .pdf"
Apa cara yang tepat untuk melakukan ini?
Terima kasih, Jeff
#
.#
.(3)
. Yang terbaik adalah mengutip argumen sehingga shell tidak mempengaruhi mereka.Jawaban:
Versi pendek:
Jangan disalurkan
ls
kexargs
. Sebaliknya, pipafind ... -print0
kexargs -0
, untuk menghindari masalah seperti itu.... yang dapat ditulis sebagai:
dan:
yang selanjutnya dapat disingkat menjadi hanya
rm
dengan wildcard.Biasanya,
ls
danfind
pisahkan nama file dengan baris baru, tetapixargs
bagi inputnya dengan baris baru atau spasi, menghasilkan perilaku yang Anda lihat.Dimungkinkan
xargs
untuk memisahkan hanya dengan baris baru, tetapi file juga dapat memiliki baris baru dalam namanya. Faktanya, di Linux dan BSD, satu - satunya karakter yang tidak diizinkan adalah byte "nol" atau nol - jadi itulah yang harus Anda gunakan dalam kasus tersebut.Dalam contoh 2 di atas,
-print0
memberitahufind
untuk memisahkan nama file dengan byte nol; sama untukxargs -0
. (Beberapa alat lain juga memiliki opsi serupa, sepertisort -z
ataugrep -zZ
.)"Versi singkat" menggunakan shell wildcard sederhana ("pola" di
bash
manual - lihat bagian "Ekspansi Pathname").sumber
*" "\\([1-9]\\).*
agar hanya file dengan spasi sebelum nomor paren sebelum periode (a, to be fair) dihapus.