Menghapus file dengan spasi di namanya

10

Saya mencoba menghapus semua file dengan spasi di namanya. Saya menggunakan perintah berikut. Tapi itu memberi saya kesalahan

Perintah: ls | egrep '. ' | xargs rm

Di sini jika saya hanya menggunakan ls | egrep '. 'perintah itu memberi saya semua nama file dengan spasi di nama file. Tetapi ketika saya mencoba meneruskan output ke rm, semua spasi (depan atau belakang) terhapus. Jadi perintah saya tidak dijalankan dengan benar.

Adakah petunjuk tentang cara menghapus file yang memiliki minimal satu spasi dalam namanya?

Anuj
sumber

Jawaban:

29

Anda dapat menggunakan globbing standar pada rmperintah:

rm -- *\ *

Ini akan menghapus file apa pun yang namanya mengandung spasi; ruang diloloskan sehingga shell tidak menafsirkannya sebagai pemisah. Menambahkan --akan menghindari masalah dengan nama file yang dimulai dengan tanda hubung (mereka tidak akan ditafsirkan sebagai argumen oleh rm).

Jika Anda ingin mengkonfirmasi setiap file sebelum dihapus, tambahkan -iopsi:

rm -i -- *\ *
Stephen Kitt
sumber
4
Anda pasti ingin menjalankan ini melalui yang echopertama, untuk menjaga dari kesalahan ketik. Tambahkan echodi depan dan itu akan mencetak semua file yang akan dihapus.
Bersepeda
1
Anuj, alasan mengapa ini memiliki upvotes paling banyak adalah karena meskipun findkuat, kadang-kadang Anda tidak perlu membunuh ayam dengan senapan mesin. Administrator UNIX umumnya tidak akan menggunakan find(misalnya) "menghapus semua file yang dimulai dengan huruf A" ... orang akan dengan mudah rm A*. Demikian juga untuk menghapus file yang mengandung spasi, rm dapat melakukan pekerjaan itu. Dengan kata lain, jangan tertipu karena ruang tidak terlihat dan diperlakukan secara khusus oleh shell. Cukup menghindarinya, seperti yang dilakukan Stephen Kitt, dan Anda dapat menganggapnya seperti karakter lain.
Mike S
14

Saya akan menghindari parsing lsoutput

Kenapa tidak :

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

Tidak masalah dengan rm:-).

Meskipun ini bersifat rekursif dan akan menghapus semua file dengan ruang di direktori saat ini dan direktori bersarang, sebagaimana disebutkan dalam komentar.

titik balik matahari
sumber
4
(1) Anda bisa menggunakan -name '* *'bukan regex; dan (2) dapat Anda gunakan -print0 | xargs -0 rm -iuntuk mengatasi masalah @ StephenKitt.
Kevin
1
Tidak perlu xargs. Cukup gunakan-exec rm -i '{}' +
R .. GitHub BERHENTI MEMBANTU ICE
1
@Mhmd Ada lebih banyak jebakan daripada konsol game 8-bit. mywiki.wooledge.org/ParsingLs
Daenyth
1
Jika Anda ingin menghindari subdirektori, gunakan find . -maxdepth 1 -name '* *' -delete.
Mikkel
1
@BenjaminW. diperbaiki?
solsTiCe
6

Lihat ini Misalkan nama "file aneh"

Solusi satu

rm strange\ file

solusi dua

rm "strange file"

solusi tiga

ls -i "strange file"

Anda melihat inode itu

find . -inum "numberoofinode" -exec rm {} \;

Dalam kasus nama file yang sangat aneh seperti

!-filename or --filename

menggunakan

rm ./'!-filename'
elbarna
sumber
4

Dari man xargs

xarg membaca item dari input standar, dibatasi oleh blank (yang dapat dilindungi dengan tanda kutip ganda atau tunggal atau backslash) atau baris baru, dan menjalankan perintah (defaultnya adalah / bin / echo) satu atau lebih kali dengan argumen awal diikuti oleh item dibaca dari input standar. Baris kosong pada input standar diabaikan.

Kami dapat (kebanyakan) memperbaiki perintah awal Anda dengan mengubah pembatas xargs ke baris baru:

ls | egrep '. ' | xargs -d '\n' rm (jangan lakukan ini ... baca terus)

Tetapi bagaimana jika nama file berisi baris baru?

touch "filename with blanks and newline"

Karena nama file Unix dapat berisi baris kosong dan baris baru , perilaku default ini sering bermasalah; nama file yang mengandung blank dan / atau baris baru salah diproses oleh xargs. Dalam situasi ini, lebih baik menggunakan opsi -0 , yang mencegah masalah tersebut.

ls benar-benar alat untuk konsumsi langsung oleh manusia , alih-alih kita perlu menggunakan findperintah yang dapat memisahkan nama file dengan karakter null ( -print0). Kita juga perlu memberi tahu grep untuk menggunakan karakter nol untuk memisahkan input ( -z) dan output ( -Z). Akhirnya, kami memberi tahu xargs untuk juga menggunakan karakter nol ( -0)

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm

anjsimmo
sumber
1

Kamu dapat memakai:

find . -name '* *' -delete
Max ZHUANG
sumber
rm - * \ * tampaknya lebih baik
Max ZHUANG
Juga, ini dicakup oleh komentar Kevin tentang jawaban solsTiCe.
G-Man Mengatakan 'Reinstate Monica'
-1

Untuk melakukannya dengan cara itu, Anda perlu -Zopsi grep, dan -0opsi xargs. Tapi saya tidak akan melakukannya dengan cara itu ( lsbukan alat yang tepat untuk pekerjaan itu, ada banyak masalah dalam membuat komputer membaca outputnya).

Lihat jawaban lain untuk cara yang lebih baik.


Juga

ls | …setara dengan ls -d *danecho * | …

Kesemuanya memiliki masalah. Karena itu jangan gunakan lsseperti ini, gunakan solusi dari jawaban lain.

ctrl-alt-delor
sumber
Juga ls *ketika pipa menghasilkan nama file baris baru dibatasi. echo(setidaknya beberapa echoimplementasi) memperluas urutan backslash. grep -Zadalah untuk menulis nama file yang dibatasi NUL saat menggunakan -l, itu tidak akan membantu di sini. Jika Anda maksudkan -z, itu tidak akan membantu karena sebagian besar lsimplementasi tidak memiliki opsi untuk menampilkan nama file yang dibatasi oleh NUL. Orang bisa melakukan sesuatu seperti itu printf '%s\0' * | grep -z ' ' | xargs -r0 rm -f.
Stéphane Chazelas
1
@ Kusalananda saya pikir saya telah memperbaikinya.
ctrl-alt-delor