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/oldold
(.*[^[: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
prenamesed en ancak referanslar yakalanan gruplar olarak değil çok benzer bir perl ikame komutu kullanır \1ve \2ancak $1ve $2.
NOT: Bazı linux'lar uyumsuz olan ve yukarıdaki gibi çalışmayan farklı bir renameyardımcı program yükler .