Intereting Posts
Ярлыки клавиш быстрого доступа не позволяют мне использовать одну и ту же комбинацию как создать модуль autoconf и как загрузить его для компиляции другой программы Как проверить, требуется ли разрешение «sudo» для запуска команды? Повторная ошибка: #error «Только <glib.h> может быть включен напрямую». Как файл sed может быть отформатирован так же, как печать в формате printf? Как проанализировать файл для извлечения 3 цифр, хранящихся в «групповом номере», sed – * работает, + не работает? Откройте статический IP-адрес подключенного Ethernet-кабеля Что сломается, если я удалю python2 Автозаполнение удаляет последний символ из слов иногда Как использовать три монитора на ноутбуке? Как отключить порты удаленно, не закрывая себя? Как обнаружить глобальные нажатия клавиш Почему это сетевое подключение так медленно? setfacl не работает в файлах, созданных Apache

Перемещение файлов рекурсивно, если выполняется определенное условие

У меня есть следующее дерево каталогов:

records/13/2014.12.16/00/05.mpg records/13/2014.12.16/00/15.mpg records/13/2014.12.16/01/05.mpg records/13/2014.12.16/02/15.mpg records/15/2014.12.14/05/25.mpg etc. 

Мне нужно переименовать каждый файл, который имеет *5.mpg в своем имени, на *0.mpg . Так, например:

 mv records/13/2014.12.16/00/05.mpg records/13/2014.12.16/00/00.mpg mv records/13/2014.12.16/00/15.mpg records/13/2014.12.16/00/10.mpg mv records/15/2014.12.14/05/25.mpg records/15/2014.12.14/05/20.mpg etc. 

Я знаю, что мне нужно написать сценарий bash для этого. К сожалению, я плохо разбираюсь в этом, поэтому я прошу вас о помощи. Я предполагаю, что ему придется вводить каждый каталог (рекурсивную часть) и перемещать каждый файл в этом каталоге, если его имя содержит *5.mpg .

Просто *.5mpg все файлы *.5mpg и используйте справку по расширению параметров для изменения имен файлов:

 for file in *5.mpg; do mv -- "$file" "${file%5.mpg}"0.mpg; done 

Чтобы сделать это для разных каталогов, установите параметр globstar ( shopt -s globstar в bash) и дополнительно возьмите компонент пути с командой dirname или снова с помощью расширения параметров.

Другое решение:

find records -type f -iname '*.mpg' | xargs rename 5.mpg 0.mpg

Поскольку все файлы, которые вы хотите переименовать, заканчиваются на * 5.mpg, эта комбинация find + rename будет работать отлично для вас.

На самом деле я попытался написать собственный сценарий. Кажется, это работает:

 #!/bin/bash find . -type f -iname "*5.mpg" -print0 | while IFS= read -r -d $'\0' line; do new=${line//5.mpg} zero="0.mpg" buffer=$new$zero new=$buffer mv $line $new echo "Moving $line" done