Menghapus file tertentu berdasarkan nama file dari terminal

13

Saya memiliki direktori yang berisi file dengan nama

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

dan seterusnya. Saya ingin menghapus semua yang merupakan kelipatan dari 5000.

Saya mencoba yang berikut:, printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmtapi itu memberi saya respons rm: missing operand.

Apakah ada cara lain untuk melakukan ini?

BillyJean
sumber
6
Terlepas dari bagaimana Anda melakukan ini, saya sarankan (untuk keamanan) memindahkan file yang diinginkan ke direktori, maka ketika Anda telah mengkonfirmasi bahwa semua dan hanya file yang akan dihapus ada di direktori, hapus direktori.
user117529
Keselamatan sangat penting di sini. Saya biasanya menguji hal-hal ini dengan lsterlebih dahulu.
Scot

Jawaban:

49

Anda tidak perlu perulangan atau perintah tambahan di tempat yang Anda miliki Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

Penjelasan : {start..end..step}. Untuk -fmengabaikan prompt pada file yang tidak ada.


Ps Untuk menjaga keamanan dan memeriksa file mana yang akan dihapus, silakan lakukan tes terlebih dahulu dengan:

ls -1 rho_{0..200000..5000}.txt
αғsнιη
sumber
13

rmtidak membaca dari input standar. Anda bisa melakukannya:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Saya menyertakan -iopsi untuk rmmeminta sebelum dihapus agar Anda dapat memverifikasi perilaku tersebut. Setelah yakin melakukan apa yang diinginkan, Anda dapat menghilangkan opsi itu.

Sunting: Atau, Anda dapat melakukan:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Formulir itu mungkin lebih akrab jika Anda telah melakukan pemrograman apa pun.

Andy Dalton
sumber
12

Anda tidak dapat mem-pipe ke suatu program seolah-olah konten dari pipa adalah argumen. Ini dikirim melalui stdin.

Anda harus menggunakan xarg untuk tujuan ini:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

tetapi pertama-tama Anda dapat mencoba dengan gema untuk melihat apakah semuanya seperti yang Anda inginkan:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
M4rty
sumber
Jika versi Anda seqmemiliki opsi -f/ --formatAnda dapat menggunakannya alih-alih ini bekerja dengan printfdan substitusi perintah.
David Foerster
Terima kasih, saya baru saja menjawab menggunakan perintah yang digunakan dalam pertanyaan dan mencoba menjelaskan kesalahan rm
M4rty
9

Seseorang mengoreksi saya jika saya salah, tetapi jika semua file yang dimulai dengan rho_formulir ini, tidak setara dengan yang harus dilakukan

rm rho_0.txt rho_*[05]000.txt

Karena angka (selain 0) adalah kelipatan dari 5000 jika dan hanya jika berakhir pada 0000 atau 5000.

(0 adalah kasus khusus, karena merupakan kelipatan dari 5000, tetapi biasanya ditulis tanpa nol awal tambahan. Jika Anda tidak bermaksud memasukkan 0, maka keluarkan dari baris di atas.)

Tentu saja ini hanya boleh digunakan jika semua rho_*.txtfile dalam direktori Anda memiliki bentuk yang diinginkan. Jangan menggunakannya jika direktori Anda juga mengandung rho_please_dont_delete_me_5000.txt.

(Catatan matematika: Ini bekerja tepat karena semua faktor prima dari 5000, yaitu 2 dan 5, juga merupakan faktor utama dari basis tempat kami bekerja, 10. Sama halnya, ada kekuatan 10 yang cukup besar (yaitu 10.000) yang merupakan habis dibagi 5000. Tidak ada trik serupa untuk mencocokkan semua yang merupakan kelipatan dari 3000.)

Nate Eldredge
sumber
Ini sebenarnya adalah jawaban terbaik.
cesarv