Saya perlu mengganti nama berikut ini:
file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png
ke
upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png
Bagaimana cara mewujudkannya hanya dengan satu baris perintah terminal?
rename
regex
batch-rename
Unamata Sanatarai
sumber
sumber
Jawaban:
Solusi untuk contoh di atas, menggunakan rename :
Pemakaian:
Dari
man rename
:ganti nama MUNGKIN ambil regex sebagai argumen.
Yang kami lihat adalah konten di antara tanda kutip tunggal
'
. Anda dapat menempatkan regex dipisahkan oleh/
.Formula: di
s/(1)/(2)/
mana(1)
= pola pencarian, dan(2)
= ganti pola.Jadi, biasakan diri Anda dengan regex , dan nikmati penggantian nama file batch berdasarkan pola!
sumber
rename
mudah diinstalbrew install rename
.--no-act
bendera--nono
sebagai gantinya. Jawaban ini juga bisa sedikit lebih eksplisit:[files]
merujuk pada pola pencocokan pola awal dalam direktori saat ini yang ingin diubah namanya secara potensial (misalnya,*
cocok dengan semuanya, tetapi hanya di direktori saat ini).rename
, yang memiliki formatrename from to file
dan tidak mendukung ekspresi reguler. Sebenarnya, distribusi Linux saya (Cent OS 7) memiliki versi yang persis seperti itu.jika file berada dalam beberapa direktori, gunakan nama setelah menemukan seperti:
-n setelah rename adalah untuk menguji, hapus untuk melanjutkan! -)
seperti ini, Anda mengasosiasikan menemukan dan mengganti nama kekuatan.
Secara pribadi, saya menggunakannya untuk mengganti nama sumber header .h ke .hpp
sumber
-iname
,-type
dan-exec
bendera di manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression . (find --help
tidak terlalu membantu untuk perintah ini.) TL; DR:-iname
cocok dengan pola huruf - tidak sensitif;-type f
cocok dengan "file biasa"; dan-exec
mengeksekusi ekspresi sampai bertemu dengan;
karakter (titik koma).Ini bisa dilakukan dengan sedikit keajaiban ekspansi parameter bash!
file_[0-9]*_*;
- Pola pertama digunakan untuk melewati semua file yang dimulai dengan 'file_anynumber_'${f#file_[0-9]*_}
- Pola keduafile_[0-9]*_
digunakan dalam ekspansi parameter yang memberitahu bash untuk menghapus 'file_anynumber_' dari mengemis string.Untuk informasi lebih lanjut tentang
Parameter expansion
:sumber
[0-9]*
akan cocok dengan satu digit diikuti oleh string apa pun. Mungkin ada cara yang lebih baik untuk mencocokkan angka saja, tetapi saya tidak bisa memikirkan sesuatu yang ringkas.