Menggunakan rename
(prename
dalam beberapa kasus) skrip yang terkadang diinstal dengan Perl, Anda dapat menggunakan ekspresi Perl untuk melakukan penggantian nama. Skrip melompati penggantian nama jika ada benturan nama.
Perintah di bawah hanya mengganti nama file yang memiliki empat digit atau kurang diikuti dengan ekstensi ".txt". Itu tidak mengganti nama file yang tidak sepenuhnya sesuai dengan pola itu. Itu tidak memotong nama yang terdiri dari lebih dari empat digit.
rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
Beberapa contoh:
Original Becomes
1.txt 0001.txt
02.txt 0002.txt
123.txt 0123.txt
00000.txt 00000.txt
1.23.txt 1.23.txt
Jawaban lain yang diberikan sejauh ini akan mencoba mengganti nama file yang tidak sesuai dengan pola, menghasilkan kesalahan untuk nama file yang mengandung karakter non-digit, melakukan penggantian nama yang menghasilkan tabrakan nama, mencoba dan gagal mengganti nama file yang memiliki spasi di namanya dan mungkin masalah lain.
Satu kalimat:
ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
Bagaimana cara menggunakan grep untuk hanya mencocokkan baris yang berisi \d.txt (IE 1 digit, lalu titik, lalu huruf txt)?
grep -E '^[0-9]\.txt$'
Coba:
for a in [0-9]*.txt; do
mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done
Ubah pola nama file ([0-9]*.txt
) seperlunya.
Penggantian nama yang disebutkan untuk tujuan umum yang tidak membuat asumsi tentang set awal nama file:
X=1;
for i in *.txt; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
Pada topik yang sama:
- Bash script untuk mengisi nama file
- Ekstrak nama file dan ekstensi di bash
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done