У меня есть куча (около 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' {} \;
Однако есть побочный эффект. Временные метки всех файлов изменились.