Как использовать шаблоны glob / regex для переименования файлов в терминале? - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь создать быстрый способ изменить формат имени файла, чтобы изменить исходное имя файла. Пример:

У меня есть три файла:

2019_12_10_Mike_Smith_item1.jpg
2016_06_24_John_Ward_item2.jpg
2011_11_18_Charlie_Coyle_item3.jpg

Формат файла для этих трех файлов:

YYYY_MM_DD_Fname_Lname_item#.jpg

Я хочу переименовать этот файл в следующем формате:

Fname_Lname_item#_YYYY_MM_DD.jpg

Так что наш первый файл теперь будет:

Mike_Smith_item1_2019_12_10.jpg

У меня очень мало опыта работы в Terminal / Bash, и я провел последние несколько часов в поисках способов сделать это с GLOB / REGEX. Я знаком с регулярными выражениями, но не могу понять, как ссылаться на сгруппированные элементы. Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 26 июня 2019

Вот один метод, который использует глобусы и функции удаления префиксов / суффиксов bash:

for f in *.jpg; do
    g=${f%.jpg}
    mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"
done

Пример

Рассмотрим каталог с этими файлами:

$ ls *jpg
2011_11_18_Charlie_Coyle_item3.jpg  2016_06_24_John_Ward_item2.jpg  2019_12_10_Mike_Smith_item1.jpg

Теперь запустите нашу команду:

$ for f in *.jpg; do g=${f%.jpg}; mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"; done

Это файлы после:

$ ls *jpg
Charlie_Coyle_item3_2011_11_18.jpg  John_Ward_item2_2016_06_24.jpg  Mike_Smith_item1_2019_12_10.jpg

Как это работает

  • for f in *.jpg; do

    Это запускает цикл над каждым jpg-файлом в текущем каталоге.

  • g=${f%.jpg}

    Это удаляет .jpg из конца имени файла и присваивает результат переменной g.

  • mv -i -- "$f" "${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg"

    Переименовывает файл $f в ${g#*_*_*_}_${g%_${g#*_*_*_}}.jpg. ${g#*_*_*_} - имя файла после удаления даты. ${g%_${g#*_*_*_}} это дата.

    Вот пример, показывающий, что происходит шаг за шагом. Давайте начнем с присвоения имени файла переменной f:

    $ f=2011_11_18_Charlie_Coyle_item3.jpg
    

    g будет именем файла без суффикса:

    $ g=${f%.jpg}
    

    Имя файла без даты:

    $ echo "${g#*_*_*_}"
    Charlie_Coyle_item3
    

    Дата без остальной части имени файла:

    $ echo "${g%_${g#*_*_*_}}"
    2011_11_18
    
  • done

    Сигнализирует об окончании цикла.

...