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

У меня много каталогов. Каждый из них имеет файл с определенным расширением .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
  • Рекурсивно выполнить композитную команду imagemagick в дереве каталогов
  • Поиск рекурсивно большого файла
  • Изменение владельца файла на основе предыдущего владельца
  • Разница между cp -r и cp -a
  • rsync рекурсивно с определенной глубиной подпапок
  • Восстановление из chown -R /
  • 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

    Обновлено Fedora 18 – нет звуковых устройств, только фиктивный вывод

    Проблемы с загрузкой Kali Linux 1.0.9a 64 бит на Macbook Pro

    создание моего собственного initrd, как заполнить каталог dev

    Как одновременно воспроизводить звуки в системе объемного звучания 4.0 с использованием aplay

    Помогите с распаковкой .dd.gz, возможно, поврежденной

    Как создать файл подкачки?

    как просматривать журналы ошибок php и сервера?

    Ошибка сценария сканирования cPanel при сравнении двух переменных: [:: ожидается целочисленное выражение

    Как проверить, проходит ли данное соединение через VPN?

    Как перезапустить декорации окон KDE, не теряя при этом X-сессию

    Как присвоить значение ключу пути в файле .desktop, включая переменную среды $ HOME, правильно?

    Настройка сетевого принтера для архивирования заданий на печать

    Иногда вентилятор процессора не запускается

    Как уменьшить раздел подкачки

    Выполняется ли какая-либо ОС Linux без ОС Linux?

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