Saya memiliki daftar file ini di server Linux:
abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10
Saya telah menghapus file log yang dipilih satu per satu, menggunakan perintah rm -rf
lihat di bawah ini:
rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28
Apakah ada cara lain agar saya dapat menghapus file yang dipilih sekaligus?
GNU
ini diperlukan?Jawaban:
Bash mendukung semua jenis wildcard dan ekspansi.
Kasus persis Anda akan ditangani oleh ekspansi brace , seperti:
Di atas akan berkembang menjadi satu perintah dengan ketiga argumen, dan setara dengan mengetik:
Penting untuk dicatat bahwa ekspansi ini dilakukan oleh shell,
rm
bahkan sebelum dimuat.sumber
Gunakan karakter pengganti (
*
) untuk mencocokkan beberapa file.Misalnya, perintah di bawah ini akan menghapus semua file dengan nama yang diawali dengan
abc.log.2012-03-
.Saya akan merekomendasikan
ls abc.log.2012-03-*
untuk menjalankan daftar file sehingga Anda dapat melihat apa yang akan Anda hapus sebelum menjalankanrm
perintah.Untuk lebih jelasnya lihat halaman manual Bash pada perluasan nama file .
sumber
Jika Anda ingin menghapus semua file yang namanya cocok dengan formulir tertentu, wildcard (pola glob) adalah solusi yang paling mudah. Beberapa contoh:
Ekspresi reguler lebih efektif daripada karakter pengganti; Anda dapat memberi makan keluaran
grep
kerm -f
. Misalnya, jika beberapa nama file diawali dengan"abc.log"
dan beberapa dengan"ABC.log"
,grep
memungkinkan Anda melakukan pencocokan tidak peka huruf besar / kecil:Ini akan menimbulkan masalah jika salah satu nama file mengandung karakter lucu, termasuk spasi. Hati-hati.
Ketika saya melakukan ini, saya menjalankan
ls | grep ...
perintah terlebih dahulu dan memeriksa apakah itu menghasilkan output yang saya inginkan - terutama jika saya menggunakanrm -f
:di mana
!!
meluas ke perintah sebelumnya. Atau saya bisa mengetik panah atas atau Ctrl-P dan mengedit baris sebelumnya untuk menambahkanrm -f
perintah.Ini mengasumsikan Anda menggunakan bash shell. Beberapa shell lain, terutama csh dan tcsh dan beberapa shell turunan sh yang lebih lama, mungkin tidak mendukung
$(...)
sintaks. Anda dapat menggunakan sintaks backtick yang setara:The
$(...)
sintaks lebih mudah dibaca, dan jika Anda benar-benar ambisius itu bisa bersarang.Terakhir, jika subset file yang ingin Anda hapus tidak dapat dengan mudah diekspresikan dengan ekspresi reguler, trik yang sering saya gunakan adalah mencantumkan file ke file teks sementara, lalu mengeditnya:
Saya kemudian dapat mengedit
list
file secara manual, hanya menyisakan file yang ingin saya hapus, dan kemudian:atau
(Sekali lagi, ini mengasumsikan tidak ada nama file yang mengandung karakter lucu, terutama spasi.)
Atau, saat mengedit
list
file, saya dapat menambahkanrm -f
ke awal setiap baris dan kemudian:atau
Mengedit file juga merupakan kesempatan untuk menambahkan tanda kutip jika perlu, misalnya mengubah
rm -f foo bar
menjadirm -f 'foo bar'
.sumber
Cukup gunakan pilihan multiline di sublime untuk menggabungkan semua file menjadi satu baris dan tambahkan spasi di antara setiap nama file lalu tambahkan
rm
di awal daftar. Ini sebagian besar berguna ketika tidak ada pola dalam nama file yang ingin Anda hapus.sumber
Kartu liar akan bekerja dengan baik untuk ini, meskipun untuk amannya akan lebih baik untuk menggunakan kartu liar seminimal mungkin, jadi sesuatu di sepanjang baris ini:
Meskipun dari kelihatannya, apakah itu hanya file tunggal? Opsi rekursif tidak diperlukan jika tidak ada item yang merupakan direktori, jadi sebaiknya jangan gunakan itu, hanya untuk keamanan.
sumber
Saya bukan ahli linux, tapi saya yakin Anda ingin menyalurkan daftar file keluaran ke
xargs rm -rf
. Saya telah menggunakan sesuatu seperti ini di masa lalu dengan hasil yang bagus. Uji pada direktori sampel terlebih dahulu!EDIT - Saya mungkin salah paham, berdasarkan jawaban lain yang muncul. Jika Anda bisa menggunakan wildcard, bagus. Saya berasumsi bahwa daftar asli Anda yang Anda tampilkan dihasilkan oleh program untuk memberi Anda "pilihan", jadi saya pikir piping to
xargs
adalah cara yang tepat.sumber
jika Anda ingin menghapus semua file yang termasuk dalam direktori sekaligus. Misalnya: nama Direktori Anda adalah "log" dan direktori "log" termasuk file abc.log.2012-03-14, abc.log.2012-03-15, ... dll. Anda harus berada di atas direktori log dan:
sumber