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?
echo
pertama, untuk menjaga dari kesalahan ketik. Tambahkanecho
di depan dan itu akan mencetak semua file yang akan dihapus.find
kuat, kadang-kadang Anda tidak perlu membunuh ayam dengan senapan mesin. Administrator UNIX umumnya tidak akan menggunakanfind
(misalnya) "menghapus semua file yang dimulai dengan huruf A" ... orang akan dengan mudahrm 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.Saya akan menghindari parsing
ls
outputKenapa tidak :
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.
sumber
-name '* *'
bukan regex; dan (2) dapat Anda gunakan-print0 | xargs -0 rm -i
untuk mengatasi masalah @ StephenKitt.xargs
. Cukup gunakan-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
.Lihat ini Misalkan nama "file aneh"
Solusi satu
solusi dua
solusi tiga
Anda melihat inode itu
Dalam kasus nama file yang sangat aneh seperti
menggunakan
sumber
Dari
man xargs
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"
ls
benar-benar alat untuk konsumsi langsung oleh manusia , alih-alih kita perlu menggunakanfind
perintah 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
sumber
Kamu dapat memakai:
sumber
Untuk melakukannya dengan cara itu, Anda perlu
-Z
opsi grep, dan-0
opsi xargs. Tapi saya tidak akan melakukannya dengan cara itu (ls
bukan 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 denganls -d *
danecho * | …
Kesemuanya memiliki masalah. Karena itu jangan gunakan
ls
seperti ini, gunakan solusi dari jawaban lain.sumber
ls *
ketika pipa menghasilkan nama file baris baru dibatasi.echo
(setidaknya beberapaecho
implementasi) memperluas urutan backslash.grep -Z
adalah 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 besarls
implementasi tidak memiliki opsi untuk menampilkan nama file yang dibatasi oleh NUL. Orang bisa melakukan sesuatu seperti ituprintf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
.