Saya ingin mengganti nama banyak file di direktori yang sama menggunakan skrip Bash. Nama file adalah sebagai berikut:
file2602201409853.p
file0901201437404.p
file0901201438761.p
file1003201410069.p
file2602201410180.p
Saya ingin mengganti nama ke format berikut:
file2503201409853.p
file2503201437404.p
file2503201438761.p
file2503201410069.p
file2503201410180.p
Saya membaca tentang perintah rename, dan mencoba melakukannya dengan cara ini, tetapi tidak melakukan apa-apa, saya pikir saya memiliki pertanyaan tentang sintaks. Lalu saya membaca bahwa Anda dapat membuat loop menggunakan perintah mv sebagai berikut:
for file in cmpsms*2014*.p; do
mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done
Tapi saya tidak bisa mengganti nama file. Apa yang saya lakukan salah?
*
?Jawaban:
Anda benar untuk mempertimbangkan mengganti nama terlebih dahulu. Sintaksnya sedikit aneh jika Anda tidak terbiasa dengan regex tetapi ini adalah rute tercepat / terpendek begitu Anda tahu apa yang Anda lakukan:
Itu hanya cocok dengan 4 angka pertama dan menukarnya dengan yang Anda tentukan.
Dan test harness (
-vn
artinya verbose tetapi tidak melakukan apa - apa) menggunakan nama file Anda:sumber
rename
adalah alat penggantian nama file yang sama sekali berbeda (yang dikirimkan oleh Debianrename.ul
).rename
seperti yang dilakukan debian.Ini harus melakukan trik:
Ini menggantikan string antara karakter ke-4 dan ke-12 dengan "25032014".
sumber
for f in file*; do mv $f ${f/${f:4:4}/2503}; done
juga berfungsi.for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
ini benar-benar jawaban @ Eric dari atas - tapi ini jawaban yang elegan jadi saya mengeposnya sebagai jawaban yang tepat untuk menarik lebih banyak perhatian padanya.
sumber
Ini harus melakukan trik. Catatan - Saya tidak terbiasa menyerahkan perintah massal mv - seperti yang tertulis itu hanya gema. Anda harus menyelesaikannya sebelum berhasil.
sumber
Cara asli yang sederhana untuk melakukannya tanpa perulangan, dengan direktori traversal :
Ini akan mengganti nama setiap file di tempat.
Dan di bawah ini contoh kerja dengan paralelisasi :
sumber
find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
Jika Anda sering melakukan hal semacam ini, cari "rename.pl". Ini adalah skrip perl, tetapi memungkinkan Anda untuk hanya memberinya kode perl (seperti /// ekspresi), dan itu akan melakukan pengubahan nama massal berdasarkan pada ekspresi atau kode tersebut.
Ada versi dasar di sini: http://stackoverflow.org/wiki/Rename.pl tetapi ada versi lain yang beredar di internet. Sudah ada selama berabad-abad.
sumber