find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +
(Если эта команда не работает для вас, см. Примечание о совместимости в конце этого ответа.)
Это базовая безопасная версия, которая печатает только то, что произойдет. Чтобы это произошло, избавьтесь от опции -n .
Он работал бы без -name "*:*" но хорошо бы, чтобы команда find передавала только имена файлов, которые должны быть изменены, потому что это ускоряет выполнение всей команды.
Это работает так:
find находки ...
- ... в
/path/to/directory ...
- ... все файлы (
-type f)...
- ... с соответствующими именами (
-name "*:*"), ...
- ... затем выполняет
rename (при необходимости несколько раз)...
- ... с шаблоном для замены
: на - ...
- ... для всех найденных файлов одновременно несколько файлов (
{} +).
Заметки:
- Команда не переименовывает каталоги, и это сделано специально.
- Переименование может не работать с некоторыми необычными символами в имени файла (например, перевод строки). Скорее всего, у вас нет таких имен файлов, так что это скорее официальное примечание.
Примечание о совместимости
В решении используется rename сценария Perl из пакета rename , доступного в Debian, Ubuntu. Другие дистрибутивы могут иметь rename из util-linux .
Это руководство предполагает, что решение для rename без Perl должно быть:
find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +
(Опять же, удалите -n если это выглядит правильно.) Я не проверял это все же. Я думаю, что он заменит только первое двоеточие в имени файла. Обходной путь - повторять команду (без -n , с -v), пока не останется двоеточий.
В качестве альтернативы вы можете получить скрипт Perl из архива, доступного на этом сайте (в настоящее время File-Rename-0.20.tar.gz , скрипт называется rename.PL). Смотрите также этот вопрос.