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

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

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 .

3 Solutions collect form web for “Перемещение файлов рекурсивно, если выполняется определенное условие”

Просто *.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 
  • Разрешение отклонено при попытке «mv» каталога
  • Как извлечь специально названную папку из рекурсивного каталога, удалить остальные?
  • Найти и переместить с исключением
  • Повреждение файлов с использованием rsync, нескольких процессов rsync, перемещение / переименование исходного файла
  • Замена точек в имени файла символами подчеркивания, кроме расширения
  • Переименовывать файлы случайным образом, но без повторения
  • Почему переименование файла с помощью команды mv изменяет дату и время «изменения» inode?
  • Файл -> ../../archive/folder/file восстановление
  • Как выполнить mv эквивалент да | cp -rf в каталогах?
  • Как я могу перемещать файлы и просматривать прогресс (например, с индикатором выполнения)?
  • cp vs. mv: какая операция более эффективна?
  • Linux и Unix - лучшая ОС в мире.