Pada * nix tanpa perl rename
tersedia
Pada beberapa * nix tidak ada rename yang tersedia, jadi perlu lakukan rename menggunakan beberapa metode lain. Beberapa tahun yang lalu saya menyarankan di zmv
sini yang bagus, belum tentu tersedia juga.
Dengan menggunakan builtin dan sed, kita dapat dengan cepat menyiapkan skrip shell untuk melakukan ini yang memberi kita sintaksis yang sangat mirip dengan skrip perl rename, sementara kekurangan beberapa kesalahan penanganan kebaikan, itu menyelesaikan pekerjaan.
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
mv -v "$file" "$(sed $sed_pattern <<< $file)"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
Pemakaian
sedrename 's/Beethoven\ -\ //g' *.mp3
before:
./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3
after:
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3
Katakanlah kita juga ingin membuat folder target ...
Karena mv
tidak membuat folder yang tidak bisa kita gunakan sedrename
seperti di sini, tapi itu perubahan yang cukup kecil, jadi saya pikir akan lebih baik untuk memasukkannya juga.
Kita memerlukan fungsi utilitas, abspath
(atau jalur absolut) sehingga kita dapat membuat folder target untuk pola sed / rename yang mencakup struktur folder baru.
abspath () { case "$1" in
/*)printf "%s\n" "$1";;
*)printf "%s\n" "$PWD/$1";;
esac; }
Ini akan memastikan kami mengetahui nama folder target kami. Saat kami mengganti nama, kami harus menggunakannya pada nama file target.
# generate the rename target
target="$(sed $sed_pattern <<< $file)"
# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"
# finally move the file to the target name/folders
mv -v "$file" "$target"
Berikut skrip sadar folder lengkap ...
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
target="$(sed $sed_pattern <<< $file)"
mkdir -p "$(dirname $(abspath $target))"
mv -v "$file" "$target"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
Tentu saja, itu masih berfungsi ketika kita tidak memiliki folder target spesifik juga.
Jika kami ingin memasukkan semua lagu ke dalam folder, ./Beethoven/
kami dapat melakukan ini:
Pemakaian
sedrename 's|Beethoven - |Beethoven/|g' *.mp3
before:
./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3
after:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
Putaran bonus ...
Menggunakan skrip ini untuk memindahkan file dari folder ke satu folder:
Dengan asumsi kami ingin mengumpulkan semua file yang cocok, dan menempatkannya di folder saat ini, kami dapat melakukannya:
sedrename 's|.*/||' **/*.mp3
before:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
after:
./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3
Perhatikan pada pola sed regex
Aturan pola sed reguler berlaku dalam skrip ini, pola ini bukan PCRE (Perl Regular Regular Expressions). Anda bisa menambahkan sintaks ekspresi reguler yang diperluas, menggunakan salah satu sed -r
atau sed -E
tergantung pada platform Anda.
Lihat patuh POSIX man re_format
untuk deskripsi lengkap dari pola dasar dasar dan regexp diperluas.