Массовое переименование или удаление в Linux

У меня есть куча (около 10 гигабайт) файлов, которые мне нужно скопировать с внешнего диска Linux на компьютер с Windows. К сожалению, некоторые имена файлов, содержащие символ ":", попали в эту коллекцию.

Ни один из этих файлов двоеточия не должен быть на компьютере с Windows, поэтому мне нужно быстрое решение, чтобы убрать или переименовать их.

Что бы вы все порекомендовали? (Я предполагаю что-то вроде скрипта bash / perl / python в Linux. У нас нет powershell на компьютере с Windows.)

7 ответов

Решение

Просмотрите оскорбительные файлы.

find /path/to/files -name '*:*' -print

Удалите оскорбительные файлы.

find /path/to/files -name '*:*' -exec rm {} +

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

find /path/to/files -name '*:*' -exec rename ':' '_' {} +

Для более эффективной версии Dan C's удалите поддержку некоторых вариантов UNIX:

find /path/to/files -name '*:*' -delete

это избавляет от необходимости форк и exec /bin/rm для каждого соответствующего файла.

это -delete опция присутствует в MacOS X и в моей системе FC11 (с findutils-4.4.0). Я не знаю, как давно это было добавлено к findutils,

Также,

mmv ";*:*" "#1#2#3"

или аналогичная команда тоже должна сработать. Сначала запустите его с -nv, просто чтобы посмотреть, что будет перемещено, без каких-либо изменений.

Самым простым способом может быть заархивировать всю структуру и распаковать файл на диск Windows. Распаковать знает, как переназначить недопустимые символы.

Требуется у вас есть место на диске, хотя:(

Если вы хотите изменить имена файлов в полете (не изменяя исходный каталог), в GNU tar есть опция --transform.

tar cf - -C $SOURCE_DIR . --transform=s/:/_/g | tar xf - -C $DEST_DIR

Вы также можете использовать опцию --exclude, чтобы избежать этих файлов.

tar cf - -C $SOURCE_DIR . --exclude='*:*' | tar xf - -C $DEST_DIR

Я не вижу опции --transform на машинах RHEL5, где я работаю, но я думаю, что это довольно распространенное в противном случае.

Это действительно должен быть комментарий к наиболее выбранному ответу выше, но я не могу (пока) применить комментарий.

У меня есть эта версия переименования в системе Debian jessie.

$ rename -V
/usr/bin/rename using File::Rename version 0.20

Я успешно переименовал с помощью:

find . -name '*:*' -exec rename 's/:/_/g' {} \;

Тем не менее, есть побочный эффект. Метки времени на всех файлах изменились.

Вы можете удалить все файлы, выполнив

rm *:*

в каталоге на коробке Linux.

Это должно удалить все файлы, содержащие двоеточие.

Или вы можете переименовать их с помощью команды переименования

rename 'y/(.*):(.*)/$1$2/' *

Это заменит тест: что-то, чтобы быть тестом-то

Другие вопросы по тегам