Saya ingin menghapus beberapa paket di file rumah saya, tetapi nama file terlalu panjang ( google-chrome-stable_current_i386.deb
). Jadi, saya memutuskan untuk menggunakan perintah ls|grep chrome|rm
untuk mem-pipe file ke grep untuk menyaring file chrome, dan kemudian menghapusnya. Itu tidak berhasil, jadi saya ingin melihat bagaimana saya bisa melakukan ini.
33
rm -i *chrome*.deb
ls
find
-find . -name "*chrome*" -delete
.ls
melaluigrep
kerm
tapi tidak bisa mendapatkannya untuk bekerja. Dengan begitu Anda akan mendapatkan satu atau dua jawaban bagus tentang cara "benar" atau "termudah" untuk menyelesaikan tugas Anda daripada memaksa seseorang untuk memberi Anda jawaban yang baik tentang solusi yang tidak efisien.Jawaban:
Ini hampir membuatku meringis.
ls
akan menjadi lebih rumit dan rawan kesalahan daripada metode yang sudah ada sepertifind [...] -exec
atau gumpalan .rm google
dan tekan Tab. Jika tidak segera selesai, tekan Tablagi untuk melihat daftar file yang cocok. Ketikkan lebih banyak karakter dari nama file untuk mempersempitnya sampai selesai, lalu jalankan perintah.sumber
rm
- ini mungkin satu-satunya cara yang lebih umum untuk menggoreng distro Anda.Anda juga dapat menggunakan perintah find dengan wildcard:
Perhatikan bahwa argumen "-maxdepth" memastikan bahwa find hanya berfungsi di direktori saat ini, dan tidak berulang ke subdirektori.
sumber
-iname
untuk nama file case-insensitive (b) pipa untukxargs
menggunakan-print0
flag forfind
dan-0
flag forxargs
. Penggunaanxargs
memungkinkan Anda untuk melakukan hal-hal seperti penghapusan "interaktif" (konfirmasi hapusfoo
?).find . -name '*chrome*' -exec rm -i {} +
maxdepth
untuk menjadi 1.Anda punya ide yang tepat, hanya melewatkan beberapa detail. Karena Anda berurusan dengan daftar yang datang ke STDIN dan
rm
mengharapkan parameter, Anda perlu menggunakannyaxargs
.Demikian:
Harus memberi Anda apa yang Anda inginkan.
Catatan bahwa jika Anda ingin menghapus segala sesuatu selain
chrome
berkas, Anda hanya dapat menambahkan-v
kegrep
pernyataan.Perhatikan bahwa, per jawaban lain untuk pertanyaan ini, ini mungkin cara yang buruk untuk mencapai apa yang ingin Anda capai.
sumber
-v
, bukankah ini akan menghapus semuanya kecuali file yang cocokchrome
? Saya tidak berpikir itu yang diinginkan OP ...ls
output. Nama file dengan spasi akan merusak ini. Ini juga berbahaya jika seseorang dapat membuat nama file dengan saus khusus di direktori tempat Anda menjalankan ini. Seperti yang telah ditunjukkan lebih dari satu orang, jangan parsing output dari ls !Jangan pernah menguraikan output ls
Saran saya adalah untuk menghindari mengurai output ls [ 1 ] , bahkan lebih jika dalam hubungannya dengan
del
perintah. Ini karena berbagai alasan terutama terkait dengan karakter tak terduga dan tidak biasa yang diizinkan dalam nama file.Bahkan ketika Anda harus berharap bahwa nama file milik paket Linux akan "berperilaku baik" , masalah ini tetap dapat muncul jika file lain ada di direktori yang sama tetapi Anda tidak tahu atau perhatikan.
Lebih baik digunakan
find
, ekspansi tab (mulai menulis nama dan tekan Tab), ekspansi nama file [ 2 ] sebagai*MyKey*
...Solusi cepat
Karena Anda ingin memilih semua paket (yang diakhiri dengan
.deb
) dengan "google" di dalamnya Anda dapat membangun permintaan Anda dengan wildcard*
*google*.deb
dan melakukan yang sederhanayang akan memilih setiap nama file dengan "google" di tengah yang akan selesai untuk
.deb
hadir di direktori saat ini. Opsi-i
(interaktif) akan meminta konfirmasi, kebiasaan yang baik ketika Anda menghapus file dengan ekspansi parameter.Sebuah solusi yang dekat dengan filosofi usaha Anda.
Jika tujuan Anda adalah untuk membangun potongan perintah per bagian Anda, jadi Anda telah selesai
ls
, setelahls | grep google
, dan hanya setelah Anda memeriksa output Anda, Anda dapat menjalankannya dalam subkulit$(...)
denganCara yang lebih cepat dan lebih berbahaya [ 3 ] , adalah menggunakan
!!
yang akan menjalankan perintah terakhir yang selesai dalam riwayat Anda . Anda dapat melindungi diri dari kenyataan bahwa Anda tidak memiliki kontrol visual garis yang Anda akan mengeksekusi jika Anda telah mengaktifkan terlebih dahulu opsi shell
histverify
denganshopt -s histverify
.sumber
... gunakan
-name '*c*.deb'
atau pola lain yang cocok untuk Anda.sumber
rm
tidak menerima input daristdin
. Anda harus melakukan sesuatu sepertils google-chrome* | xargs rm
sumber