Нужно рекурсивно найти все имена файлов, содержащие двоеточие, и заменить двоеточие на тире?

Нужно рекурсивно найти все имена файлов, содержащие двоеточие, и заменить двоеточие на тире?

У меня есть каталог 'main', содержащий много подкаталогов, и в некоторых из этих подкаталогов у меня есть имена файлов, содержащие двоеточие. Я загрузил каталог 'main' в репозиторий GitHub из Linux, но столкнулся с проблемой, когда попытался извлечь данные из этого репозитория на машине Windows, так как Windows не допускает двоеточия в именах файлов.

Как можно рекурсивно найти все имена файлов с двоеточием в каталоге «main» с помощью терминала Linux, а затем заменить двоеточие, скажем, на символ дефиса (-)?

решение1

find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +

(Если эта команда у вас не работает, см. Примечание о совместимости в конце этого ответа.)

Это базовая безопасная версия, которая печатает только то, что должно произойти. Чтобы это произошло, избавьтесь от -nопции.

Это работало бы и без этого -name "*:*", но лучше пропускать findтолько те имена файлов, которые следует изменить, поскольку это ускоряет выполнение всей команды.

Это работает так:

  • findнаходит...
    • ...в /path/to/directoryреж...
    • ...все файлы ( -type f)...
    • ...с соответствующими именами ( -name "*:*"),...
    • ...затем выполняет rename(при необходимости несколько раз)...
    • ...с шаблоном для замены :на -...
    • ...для всех найденных файлов, по нескольким файлам одновременно ( {} +).

Примечания:

  • Команда не переименовывает каталоги, и это сделано намеренно.
  • Переименование может не работать с некоторыми необычными символами в имени файла (например, новой строкой). Скорее всего, у вас нет таких имен файлов, так что это скорее формальное замечание.

Примечание о совместимости

Решение использует скрипт Perl renameиз renameпакета, доступного в Debian, Ubuntu. Другие дистрибутивы могут иметь renameиз util-linux.

Это руководствопредполагает, что решение для не-Perl renameдолжно быть следующим:

find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +

(Опять же, удалите, -nесли выглядит правильно.) Я это не проверял. Думаю, это заменит только первое двоеточие в имени файла. Обходной путь — повторять команду (без -n, с -v), пока не останется двоеточий.

В качестве альтернативы вы можете получить скрипт Perl из архива, доступного наэтот сайт(в настоящее время File-Rename-0.20.tar.gzскрипт называется rename.PL). Смотрите такжеэтот вопрос.

Связанный контент