Saya akan menyarankan tiga alternatif. Masing-masing adalah perintah baris tunggal yang sederhana, tetapi saya akan memberikan varian untuk kasus yang lebih rumit, terutama jika file yang akan diproses dicampur dengan file lain dalam direktori yang sama.
mmv
Saya akan menggunakan perintah mmv
dari paket dengan nama yang sama :
mmv '*HBO_DPM*' '#1dpm#2'
Perhatikan bahwa argumen dilewatkan sebagai string, sehingga ekspansi glob tidak terjadi di shell. Perintah menerima tepat dua argumen, dan kemudian menemukan file yang sesuai secara internal, tanpa batasan ketat pada jumlah file. Perhatikan juga bahwa perintah di atas mengasumsikan bahwa semua file yang cocok dengan gumpalan pertama harus diganti namanya. Tentu saja Anda bebas untuk lebih spesifik:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Jika Anda memiliki file di luar rentang angka yang diminta dalam direktori yang sama, Anda mungkin lebih baik dengan perulangan nomor yang diberikan lebih lanjut dalam jawaban ini. Namun Anda juga bisa menggunakan urutan doa mmv dengan pola yang sesuai:
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
putaran angka
Jika Anda ingin menghindari memasang apa pun, atau perlu memilih dengan rentang nomor menghindari kecocokan di luar kisaran ini, dan Anda siap untuk menunggu 74.023 permintaan perintah, Anda bisa menggunakan bash loop polos:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Ini bekerja sangat baik di sini karena tidak ada celah dalam urutan. Kalau tidak, Anda mungkin ingin memeriksa apakah file sumber benar-benar ada.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
Perhatikan bahwa berbeda dengan for ((i=89000; i<=163022; ++i))
ekspansi brace yang menangani angka nol terkemuka sejak beberapa Bash merilis beberapa tahun yang lalu. Sebenarnya perubahan yang saya minta, jadi saya senang melihat kasus penggunaan untuk itu.
Bacaan lebih lanjut: Perluasan Brace di halaman info Bash, khususnya bagian tentang {x..y[..incr]}
.
loop file
Pilihan lain adalah melompati glob yang sesuai, alih-alih melompati rentang integer yang dimaksud. Sesuatu seperti ini:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Sekali lagi ini adalah satu mv
permintaan per file. Dan lagi loop adalah daftar elemen yang panjang, tetapi seluruh daftar tidak diteruskan sebagai argumen untuk suatu subproses, tetapi ditangani secara internal oleh bash, sehingga batas tidak akan menyebabkan masalah.
Bacaan lebih lanjut: Ekspansi Parameter Shell di halaman info Bash, mendokumentasikan ${parameter/pattern/string}
antara lain.
Jika Anda ingin membatasi rentang angka ke yang Anda berikan, Anda dapat menambahkan tanda centang untuk itu:
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
Di sini ${i##pattern}
menghapus pencocokan awalan terpanjang pattern
dari $i
. Awalan terpanjang itu didefinisikan sebagai apa saja, lalu garis bawah, lalu nol atau lebih nol. Yang terakhir ditulis sebagai *(0)
yang merupakan pola gumpal diperpanjang yang tergantung pada extglob
opsi yang ditetapkan. Menghapus angka nol di depan adalah penting untuk memperlakukan angka sebagai basis 10 bukan basis 8. +([0-9])
Argumen loop adalah glob yang diperluas, cocok dengan satu atau lebih digit, kalau-kalau Anda memiliki file di sana yang memulai yang sama tetapi tidak berakhir dengan jumlah.
ARG_MAX
. Karena pertanyaan ini secara eksplisit meminta solusi baris perintah, solusi GUI (mungkin sama) seperti pada pertanyaan lain juga tidak cocok.