У меня есть несколько файлов домашнего видео в разных каталогах, в конце имени каталога которых указан год, чтобы указать год, когда видео было снято. Он также находится в конце имен файлов в этом каталоге и перед расширением. Я хочу поставить круглые скобки в течение года.

У некоторых файлов и каталогов также может быть год (или числа, которые выглядят как год) в имени файла в других позициях, но я просто хочу поставить скобки вокруг года в конце. Например вот один из каталогов:

Videos/Xmas 2004 - Time To Go 2004

содержит:

Xmas 2004 - Time To To 2004.mp4  
Xmas 2004 - Time To Go 2004.txt  
Xmas 2004 - Time To Go 2004.readme  

Я хочу переименовать все мои медиафайлы, чтобы в итоге появилась система именования:

Videos/Xmas 2004 - Time To Go (2004)

содержит

Xmas 2004 - Time To To (2004).mp4  
Xmas 2004 - Time To Go (2004).txt  
Xmas 2004 - Time To Go (2004).readme

Как мне это сделать? Я могу использовать команду "find", чтобы получить файлы и каталоги:

find /home/user/Videos/ -iname "* [1-2][0-9][0-9][0-9]"    # Find directories
find /home/user/Videos/ -iname "* [1-2][0-9][0-9][0-9].*"  # Find files

Мне интересно, как я могу использовать "-exec {} \;" структура для использования команды rename или mv (или sed или awk), или я пишу сценарий bash для управления строкой имени файла и помещаю ее в "-exec {} \;"

1 ответ1

0

Этот скрипт выведет необходимые команды mv на стандартный stdout . Вы должны сохранить их в файл (sh script > file) и проверить их. Если вы находите их безопасными для выполнения, тогда вы можете запустить команды в файле (sh file). Или вы можете изменить print на system в самом скрипте.

find $1 -type f > /tmp/to_rename
find $1 -type d >> /tmp/to_rename
perl -lne '
    $re = qr/([12]\d\d\d)(\.\w*)?$/;
    if (/$re/) {
        $old = $_;
        s/$re/(\1)\2/;
        print("mv \"$old\" \"$_\"");
    }
' /tmp/to_rename

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .