Наглая однострочная программа для переименования файлов по шаблону

Однажды я оказался в ситуации, когда мне нужно было переименовать серию файлов, удалив шаблон для каждого файла. Угадайте что? Это было около 150 PDF-файлов, поэтому я никак не мог сделать это вручную.
Во время поиска в интернете я нашел термин brash one-liner. Это своего рода длинная серия команд bash, объединенных для достижения цели.
Поэтому мне пришлось определить свою, чтобы решить свою проблему. После долгих экспериментов я пришел к следующему варианту:

pattern='some-pattern'; find -type f -iname "*$pattern*" | xargs -0 -I{} echo "file="{}"; mv "$file" "${file//"$pattern"/} " | bash
Войти в полноэкранный режим Выйти из полноэкранного режима

Выглядит загадочно? Да, вы правы, немного.
Позвольте мне объяснить мой подход к решению этой проблемы.
Мой подход к решению этой проблемы состоит из 4 шагов:

  • Определение шаблона
  • Поиск файлов
  • Определение команды bash на основе текста
  • Выполнение команды

Определение шаблона

   pattern='some-pattern';
Вход в полноэкранный режим Выйти из полноэкранного режима

здесь я просто сохраняю свой шаблон в переменной, чтобы не повторяться (я DRY-парень).
Примечание: Я использую здесь одинарные кавычки, потому что мой шаблон не нужно оценивать перед выполнением оболочкой.

Поиск файлов

  find -type f -iname "*$pattern*"
Вход в полноэкранный режим Выйти из полноэкранного режима

Здесь я ищу все файлы, соответствующие моему шаблону, игнорируя случай с помощью команды find
Примечание: мы должны убедиться, что шаблон соответствует только тем файлам, которые мы хотим переименовать, иначе он переименует неожиданные файлы. Пожалуйста, попробуйте сначала запустить это отдельно для проверки.

Текстовое определение команды bash

   xargs -0 -I{} echo "file="{}"; mv "$file" "${file//"$pattern"/} "
Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь происходит волшебство, поэтому мы должны использовать небольшой трюк, чтобы определить новое имя каждого файла.
Здесь мой подход заключается в использовании расширения оболочки.
Я решил использовать команду xargs, потому что она выполнит одну и ту же команду для каждого найденного файла.
Аргумент -0 здесь означает, что каждая запись заканчивается нулевым символом.
Аргумент -I{} означает, что xargs должен заменить все вхождения {} в команде на эту запись.
Внутри моей текстовой команды я определяю a, чтобы заменить все вхождения $pattern на пустой символ.
Я использовал символ escape, чтобы избежать оценки файловой переменной перед выполнением.
Примечание: я мог бы использовать команду sed, но я хотел сократить количество вводимых символов. Кстати, здесь мы можем создать любую сложную команду, так что все зависит от вашего воображения.

Выполнение команды

   bash
Войти в полноэкранный режим Выйти из полноэкранного режима

Здесь bash приходит в игру и выполняет полученную текстовую команду bash.

В конце концов, я надеюсь, что это небольшое руководство поможет вам, если вы столкнетесь с подобной проблемой. Не стесняйтесь присылать мне любые предложения или улучшения в обсуждении, спасибо за внимание.

Оцените статью
devanswers.ru
Добавить комментарий