Menghapus file tertentu dalam baris perintah

8

Saya memiliki file fileName_1 , fileName_2 ... fileName_100000 di mana nama File dinomori secara berurutan. Bagaimana saya bisa menghapus file indeks lebih besar dari, katakanlah 100 ?

teaLeef
sumber

Jawaban:

17

Jika nama file diberi nomor secara berurutan, jalankan saja perintah berikut:

rm fileName_{100..100000}
cioby23
sumber
3
Info: Ini berfungsi karena bash (shell Anda) akan memperluas {x..y}ke seluruh daftar. Misalnya jika Anda menggunakannya echo test{1..3}akan diperluas ke echo test1 test2 test3dan kemudian dieksekusi. Seperti yang Anda lihat, itu dicetak test1 test2 test3. Demikian pula, jika {x..y}tidak terhubung ke argumen apa pun, itu hanya akan menempatkan angka di sana. Misalnya echo test {1..3}hanya akan mencetak test 1 2 3.
Luc
1
Catatan: ada batasan yang dikenakan oleh execpanggilan ke jumlah argumen yang dapat dimiliki suatu proses. Anda dapat mengambilnya dengan getconf ARG_MAX. Sebagai contoh pada sistem saya itu 2097152(~ 2,1 juta). Ini berarti bahwa rm(yang bukan built-in) akan gagal dengan lebih dari banyak file. Perintah bawaan tidak memiliki masalah ini, dan solusi yang diajukan juga tidak.
Bakuriu
Perhatikan bahwa ARG_MAX adalah sejumlah byte, bukan sejumlah argumen. rm tidak bisa menangani menghapus 2097152 file sekaligus. Itu bisa menghapus 2048 file yang masing-masing memiliki nama yang panjangnya 1023 byte (bukan 1024; pembatas di antara argumen (\ 0 di C-land) dihitung hingga batasnya).
godlygeek
6

Anda dapat mencoba perintah ini juga,

for i in $(seq 100 100000); do rm fileName_$i; done

Ini akan menghapus semua file (berkisar 100 hingga 100000) jika nama file berisi angka dalam urutan berurutan.

Avinash Raj
sumber
5

Secara umum Anda memiliki beberapa cara untuk mencapai ini:

rm fileName_{100..100000}

akan diperluas oleh shell menjadi sekitar 100.000 nama file. Jika nama dasar adalah jalur panjang dan jumlahnya cukup tinggi, Anda mungkin benar-benar melebihi panjang maksimum baris perintah dengan pendekatan ini.

The forloop

for i in $(seq 100 100000); do rm fileName_$i; done

tidak menderita masalah ini, tetapi merupakan cara yang relatif lambat menghapus file, karena shell harus melakukan substitusi variabel dan meluncurkan rm sekitar 100.000 kali.

Kedua metode di atas dapat menyebabkan peringatan jika beberapa file, misalnya filename_101hilang.

Biasanya, solusi berdasarkan findlebih baik, karena mereka hanya bekerja pada file yang sebenarnya ada (selama penemuan). Namun, ada beberapa perbedaan halus:

find . -name 'fileName_[100-100000]' -exec rm {} \;

masih akan meluncurkan rmprogram sekitar 100.000 kali, sementara mengganti final \;dengan +akan mencoba untuk meminimalkan jumlah subproses. Kedua metode mungkin akan (lebih atau sedikit) lebih lambat daripada menggunakan -deleteyang tidak menggunakan perintah eksternal sama sekali tetapi memanggil sistem panggilan saja.

Namun, selalu periksa dulu apakah polanya benar-benar cocok dengan file yang ingin Anda targetkan:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

Jadi dalam hal ini Anda akan menghapus file yang ingin Anda simpan dan meninggalkan file yang seharusnya dihapus.

Stefan Schmiedl
sumber
4

Gunakan perintah berikut:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Itu akan menghapus file dari 100 hingga 100000.

Informasi lebih lanjut: Situs

nux
sumber
Anda akan lebih baik menggunakan +daripada \;- lihat di sini . Atau, lebih baik lagi, gunakan -deleteperintah find .
evilsoup
Saya menguji ini, dan itu hanya menghapus fileName_1. Kelas [100-100000] karakter hanya cocok dengan satu karakter, sehingga hanya bisa cocok dengan 0 atau 1.
deltab