ls | grep | rm - Bagaimana cara memformat perintah ini?

11

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

Jeff
sumber
1
Nama file contoh Anda tidak mengandung literal #.
Benjamin Bannier
1
@honk: Dia tidak mencari yang literal #.
Ignacio Vazquez-Abrams
1
Karena ekspansi oleh shell, ini tidak akan berfungsi seperti yang diharapkan jika cwd memiliki file bernama eg (3). Yang terbaik adalah mengutip argumen sehingga shell tidak mempengaruhi mereka.
Ignacio Vazquez-Abrams
1
Anda sedang dilanda Masalah pemisah en.wikipedia.org/wiki/Xargs#The_separator_problem
Ole Tange

Jawaban:

19

Versi pendek:

rm *\([1-9]\)*

Jangan disalurkan lske xargs. Sebaliknya, pipa find ... -print0ke xargs -0, untuk menghindari masalah seperti itu.

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

... yang dapat ditulis sebagai:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

dan:

find . -maxdepth 1 -name '*([1-9])*' -delete

yang selanjutnya dapat disingkat menjadi hanya rmdengan wildcard.


Biasanya, lsdan findpisahkan nama file dengan baris baru, tetapi xargsbagi inputnya dengan baris baru atau spasi, menghasilkan perilaku yang Anda lihat.

Dimungkinkan xargsuntuk 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, -print0memberitahu finduntuk memisahkan nama file dengan byte nol; sama untuk xargs -0. (Beberapa alat lain juga memiliki opsi serupa, seperti sort -zatau grep -zZ.)

"Versi singkat" menggunakan shell wildcard sederhana ("pola" di bashmanual - lihat bagian "Ekspansi Pathname").

pengguna1686
sumber
1
Dan untuk amannya, lebih baik digunakan *" "\\([1-9]\\).*agar hanya file dengan spasi sebelum nomor paren sebelum periode (a, to be fair) dihapus.
Ignacio Vazquez-Abrams
Tidak terlalu terbiasa dengan sintaks ini, tetapi berdasarkan upvotes yang saya coba dan apa yang Anda tahu ... itu berhasil! Terima kasih!
Jeff
1
+1. -print0 sangat penting untuk memperbaiki piping ke xargs.
Chris W. Rea