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
). Смотрите также этот вопрос.