Переименуйте все файлы с определенным расширением во весь подкаталог

У меня много каталогов. Каждый из них имеет файл с определенным расширением .ext .

Я хочу переименовать эти файлы.

Пример:

 // Note: The names are random, can have spaces and special characters Parent | |- First Directory | | | |- Some file.txt | |- Another one.pdf | `- The one to rename.ext | |- Second Directory | | | |- Some file.txt | |- Another one.pdf | `- The one to rename.ext […] 

Я хочу переименовать весь файл с расширением .ext на new name.ext2 . Существует только один файл с .ext для каталога, поэтому никаких проблем с этим.

То, что я сделал до сих пор:

 find ./Parent -name "*.ext" -exec mv "{}" "{}.ext2" \; 

И я получаю кучу The one to rename.ext.ext2 , я застрял в переименовании их new name.ext2 . Если я просто задал его как второй аргумент mv , он переместит их в Parent каталог, и, таким образом, каждый вызов функции mv перезапишет предыдущий перемещенный файл.

Примечание. Я не мог заставить его работать, используя аргумент -exec bash -c '' . Я пробовал что-то вроде:

 find ./Parent -name "*.ext" -exec bash -c 'mv {} "$(dirname {})/new name.ext2"' \; 

Но я получаю некоторую проблему с расширением $() до {}

  • Поиск разрешений для файлов, кроме 755
  • Grep во многих каталогах, но смотрите только в каждом каталоге подкаталогов, но не во всех поддиректориях
  • Как скопировать каталог и вложенные папки, но игнорировать определенные файлы в подпапке?
  • Подсчет строк кода?
  • Искать файлы по содержанию только в подкаталогах соединительных линий
  • Как искать текст по всей файловой системе?
  • Рекурсивно переименовывать файлы, используя список шаблонов и замен
  • Удаление файла в особых условиях, если возможно, рекурсивно
  • 2 Solutions collect form web for “Переименуйте все файлы с определенным расширением во весь подкаталог”

    Вы можете использовать функцию -printf функции find для создания ваших команд:

     find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext" mv /tmp/foo.ext /tmp/new_name.ext 

    Когда вы окружаете команду с помощью $() , команды будут выполнены:

     $(find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext") find /tmp -name "*.ext" /tmp/new_name.ext 

    Обновить:

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

     find /tmp -name \*.ext\* /tmp/dir with space/bar.ext /tmp/foo.ext bash -x < <(find /tmp -name "*.ext" -printf "mv \"%p\" \"%h/new_name.ext2\"\n") + mv '/tmp/dir with space/bar.ext' '/tmp/dir with space/new_name.ext2' + mv /tmp/foo.ext /tmp/new_name.ext2 find /tmp -name \*.ext\* /tmp/dir with space/new_name.ext2 /tmp/new_name.ext2 

    Использовать sed

     for file in */*.ext; do ext2=`echo $file | sed 's/.ext/.ext2/'` mv $file $ext2 done 
    Interesting Posts

    Многофункциональный CapsLock без X

    Загружаются и выгружаются модули драйвера автоматически?

    Как я могу контролировать расширение скобки bash, чтобы делать правильную вещь (что zsh делает автоматически)?

    Получение информации о виртуальной файловой системе

    Обновление MOTD при входе в систему

    Запуск git с более высоким распределением памяти

    исполняемый бит на файлы, созданные vim

    Как эмулировать эффект KWin по командной строке?

    Как хранить цветной текст в переменной и печатать его с цветом позже?

    UNIX-, BSD-, GNU-опции в команде ps для Linux. Откуда они?

    Помните макет окна на нескольких мониторах на монетном дворе Mint Cinnamon

    Не является ли страницей режима кэширования серьезной ошибкой?

    Почему этот сценарий оболочки завершается неудачно, поскольку задание cron

    netutils_t не может открыть файлы initrc_tmp_t

    Доступно ли простое в использовании многофакторное полное шифрование диска?

    Linux и Unix - лучшая ОС в мире.