Sed kullanarak
Bunu yapmanın birçok yolu vardır. Bunu öğrenirken yapmak istiyorsanız sed
, deneyin:
$ filename='track name [artist].mp3'
$ newname=$(echo "$filename" | sed -E 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[\2] \1/')
$ echo "$newname"
[artist] track name.mp3
Sed ikame komut şekline sahip bir ifadedir. Bu durumda parçalardan oluşur:s/old/new/
old
old
(.*[^[:space:]])
parça adını yakalar. Bu regex parens ile çevrili olduğundan, parça adı bir gruba kaydedilir. .*
Bölüm şeyle eşleşir. [^[:space:]]
Maçları herhangi boşluk olmayan. [^[:space:]]
Sona koyarak , bunun iz adını yakaladığını ancak ondan sonraki beyaz alanı değil.
[[:space:]]*[[]
Varsa, parça adını [
izleyen ve bunları izleyen boşluklarla eşleşir . Çünkü [
baştan çıkarıcı bir karakter, ondan bir şekilde kaçmamız gerekiyor. Burada, onu köşeli parantez içine alarak kaçarız [[]
.
(.*)[]]
Metin ]
, dosya adındaki son ile eşleşir . Buradaki parenler, sanatçının adının ikinci bir grup olarak yakalanmasına neden oluyor.
new
İkame komutunun bir parçasıdır [\2] \1
. Bu, ikinci grubu \2
(sanatçı adı) birinci ve birinci grubu \1
(parça adı) ikinci koyar .
Dosyaları yeniden adlandırmak için kısayol
Amacınız dosyaları yeniden adlandırmaksa rename
, perl paketindeki komutu tavsiye ederim (bazen denir prename
):
$ ls *mp3
track name [artist].mp3
$ prename 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[$2] $1/' *.mp3
$ ls *mp3
[artist] track name.mp3
prename
sed en ancak referanslar yakalanan gruplar olarak değil çok benzer bir perl ikame komutu kullanır \1
ve \2
ancak $1
ve $2
.
NOT: Bazı linux'lar uyumsuz olan ve yukarıdaki gibi çalışmayan farklı bir rename
yardımcı program yükler .