Назад | Перейти на главную страницу

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

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

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

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

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

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

Удалите проблемные файлы.

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

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

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

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

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

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

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

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

Однако требуется, чтобы у вас было место на диске :(

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

rm *:*

в каталоге на ящике Linux.

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

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

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

Это заменит test: something to be testsomething

Если вы хотите изменить имена файлов на лету (не изменяя исходный каталог), 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, на которых я работаю, но я думаю, что в остальном она довольно распространена.

Также,

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

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

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

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

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

Мне удалось переименовать, используя:

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

Однако есть побочный эффект. Временные метки всех файлов изменились.