Ada prename
, yang memungkinkan Anda menggunakan REGEX:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Gunakan opsi -n
untuk mensimulasikan:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Catatan: Ini dikirim sebagai rename
di banyak distribusi Linux, tetapi tidak semuanya -- jadi saya menggunakan nama kanonis untuk utilitas yang disertakan dengan Perl.
Saya akan menyarankan sesuatu seperti ini:
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-}
menggantikan kemunculan pertama *-doc-
dengan doc-
.
Jika Anda perlu melakukan lebih dari satu penggantian (lihat komentar nomor 1), Anda perlu menggunakan kode ${var//Pattern/Replacement}
varian. Jika Anda perlu mengganti awal nama, Anda perlu menggunakan ${var/#Pattern/Replacement}
, jika Anda perlu mengganti bagian akhir (yaitu:ekstensi), Anda perlu menggunakan ${var/%Pattern/Replacement}
membentuk.
Lihat Ekspansi Parameter Shell untuk lebih jelasnya. Ekspansi ini spesifik untuk bash.
Jika Anda memiliki rename
lalu, rename 's/^.*-doc-/doc-/' *.txt
harus melakukan trik.
Jika Anda ingin mengulang ke sub-direktori, ada juga:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
Pada sistem yang secara otomatis mendukung perpanjangan Regexps, Anda dapat meninggalkan -E
.
Keuntungan:
- berulang ke sub-direktori
- Anda dapat mengontrol kedalaman maksimum rekursi
- Anda dapat mengganti nama file dan/atau direktori (-type f|d)
Kekurangan:
- regexps sedikit lebih rumit, karena Anda harus menghapus jalur untuk mendapatkan nama file
(jawaban diubah dari sini)