Bagaimana cara menghapus semua file yang berisi string tertentu dalam direktori di UNIX?

3

Saya menemukan beberapa contoh yang berfungsi selama tidak ada spasi di nama file. Sayangnya, saya memiliki spasi di nama file saya (bukan pilihan saya, sebenarnya mereka yang harus saya hapus).

Jadi, misalnya, inilah yang menurut saya akan berhasil:

temukan. -type f | grep) .MOV | xargs rm

karena saya ingin menghapus file-file seperti:

  • L112 (1) .MOV
  • L113 (1) .MOV
  • L113 (2) .MOV
  • dll.

dan saya ingin menyimpan file seperti

  • L112.MOV
  • L113.MOV
  • L114.MOV
  • dll.

Ini menemukan file dengan benar:

temukan. -type f | grep) .MOV

tetapi ketika saya pipa ke rm, spasi di nama file mengacaukannya.

Bantuan apa pun akan sangat dihargai.

Craig Nakamoto
sumber

Jawaban:

5

rm *\).MOV
Kevin Lochner
sumber
Doh! Ya, itu mungkin lebih baik daripada menggunakan find :-).
Matt Solnit
1
OP mencoba untuk membuatnya membingungkan bagi kita :)
Kevin Lochner
Terima kasih, saya terkejut bahwa saya tidak dapat menemukan jawaban ini dengan Google. Sangat sederhana.
Craig Nakamoto
4

Katakan xargsuntuk menggunakan baris baru sebagai pembatas:

find . -type f | grep ).MOV | xargs -d'\n' rm

Lebih baik, findlakukan pencocokan dan penggunaan -print0dan xargs -0untuk memungkinkan karakter apa pun dalam nama file, bahkan \n!

find . -type f -name '*).MOV' -print0 | xargs -0 rm

Bahkan lebih baik, findtelepon saja rmsecara langsung.

find . -type f -name '*).MOV' -exec rm {} +

Terbaik, lewati rmdan findlakukan penghapusan.

find . -type f -name '*).MOV' -delete

Atau dalam kasus khusus ini, siapa yang butuh semua alat berat?

rm *\).MOV
John Kugelman
sumber
berdasarkan cara pertanyaan itu diajukan, ini sepertinya jawaban yang sesuai "bagaimana cara menghapus file yang berisi string" - harus membaca "nama file"
qodeninja
1

Coba ini:

find . -name "*).MOV" -exec rm {} \;
Matt Solnit
sumber
1

Banyak alat unix yang rapuh (atau setidaknya sulit untuk digunakan dengan benar) di hadapan nama file yang mengandung spasi dan tab, atau bahkan lebih buruk, baris baru, jadi ketika Anda punya pilihan, Anda harus menghindari karakter ini dalam nama file.

Namun, jika Anda ingin menghapus semua file di direktori saat ini (dan semua subdirektori) dengan spasi di namanya, berikut ini akan berfungsi.

find . -name '* *' -print0 | xargs -0 rm -f 

The -print0pilihan memberitahu menemukan menggunakan NUL byte (\ 0) sebagai pemisah antara nama file bukan NL (\ n). Sebaliknya, -0memberi tahu xargs untuk menggunakan NUL sebagai pemisah baris, bukan NL. Ubah argumen pola ke -nameopsi yang diperlukan untuk mencocokkan file yang ingin Anda hapus.

Ini mungkin agak sulit untuk mencegah findberulang ke subdirektori (walaupun periksa -maxdepthargumennya), jadi jika Anda hanya ingin memengaruhi file dalam direktori saat ini, Anda mungkin ingin mendekati masalahnya secara berbeda.

Secara keseluruhan, saya sangat merekomendasikan fasih dengan finddan xargs. Secara individual, dan terutama ketika dirantai bersama seperti yang ditunjukkan di atas, mereka membuat toolkit yang sangat fleksibel untuk operasi file massal.

Dale Hagglund
sumber
0

Di sebagian besar instalasi Unix Anda dapat menunjukkan ruang dalam nama file dengan awalan dengan backslash. Jadi misalnya, coba ini:

mkdir blah
cd blah
touch file1
touch file2
touch "file 3"
touch "file 4"

Lakukan "ls" dan Anda akan melihat ini:

file 3 file 4 file1 file2

Sekarang lakukan "ls * \ *" dan Anda akan melihat semuanya dengan spasi di dalamnya:

file 3 file 4

Jadi mungkin hanya "rm * \ *" yang Anda butuhkan? Atau modifikasi ekspresi reguler itu sedikit agar sesuai dengan kebutuhan Anda.

Semoga itu bisa membantu!

Brent Menulis Kode
sumber