Переименование файлов в соответствии с новым соглашением об именах в bash - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть каталог файлов с именами, отформатированными как

01-Peterson@2x.png
15-Consolidated@2x.png
03-Brady@2x.png

И я хотел бы отформатировать их как

PETERSON.png
CONSOLIDATED.png
BRADY.png

Но мои навыки написания скриптов на bash сейчас довольно слабы.Как лучше всего это сделать?

Редактировать: моя версия bash - 3.2.57 (1) -релиз

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Это будет работать для файлов, которые содержат пробелы (включая переводы строки), обратную косую черту или любые другие символы, включая глобальные символы, которые могут вызвать ложное совпадение с другими файлами в каталоге, и не удалит вашу домашнюю файловую систему, еслиособенно нежелательное имя файла!

for old in *.png; do
    new=$(
        awk 'BEGIN {
                base = sfx = ARGV[1]
                sub(/^.*\./,"",sfx)
                sub(/^[^-]+-/,"",base)
                sub(/@[^@.]+\.[^.]+$/,"",base)
                print toupper(base) "." sfx
                exit
            }' "$old"
        ) &&
    mv -- "$old" "$new"
done
0 голосов
/ 30 ноября 2018

Если шаблон для всех ваших файлов похож на тот, который вы опубликовали, я бы сказал, что вы можете сделать что-то такое же простое, как запустить его в своем каталоге:

for file in `ls *.png`; do new_file=`echo $file | awk -F"-" '{print $2}' | awk -F"@" '{n=split($2,a,"."); print toupper($1) "." a[2]}'`; mv $file $new_file; done

Если вы хотите изучить другие решения,как и регулярные выражения, вы также можете сделать:

for file in `ls *.png`; do new_file=`echo $file | sed "s/.*-//g;s/@.*\././g" | tr '[:lower:]' '[:upper:]'`; mv $file $new_file; done 

Тестируя его, он делает, например:

mv 01-Peterson@2x.png PETERSON.png
mv 02-Bradley@2x.png BRADLEY.png
mv 03-Jacobs@2x.png JACOBS.png
mv 04-Matts@1x.png MATTS.png
mv 05-Jackson@4x.png JACKSON.png
...