У меня есть каталог '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
). Смотрите такжеэтот вопрос.