У меня есть файлы с недопустимыми символами, такими как эти
009_-_�%86ndringshåndtering.html
Это то, Æ
где что-то пошло не так в имени файла.
Есть ли способ просто удалить все недопустимые символы?
или можно было tr
бы как-то использовать?
echo "009_-_�%86ndringshåndtering.html" | tr ???
Ответы:
Один из способов был бы с помощью sed:
Замените
file
своим именем файла, конечно. Это заменит все, что не является буквой, цифрой, точкой, подчеркиванием или тире подчеркиванием. Вы можете добавлять или удалять символы, чтобы оставить их так, как вам нравится, и / или заменить заменяющий символ на что-либо еще, или вообще ничего.источник
f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_}
Я предполагаю, что вы находитесь на коробке Linux, а файлы были сделаны на коробке Windows. Linux использует UTF-8 в качестве кодировки символов для имен файлов, в то время как Windows использует что-то другое. Я думаю, что это является причиной проблемы.
Я бы использовал "convmv". Это инструмент, который может конвертировать имена файлов из одной кодировки символов в другую. Для Западной Европы одна из этих норм обычно работает:
Если вам нужно установить его на Linux на основе Debian, вы можете сделать это, выполнив:
Он работает для меня каждый раз и восстанавливает исходное имя файла.
Источник: LeaseWebLabs
источник
Save the current file in Word 97-2004 format\sco.workflow
который был создан на моем Mac (через Microsoft Office), и приведенные выше кодировки не имеют никакого эффекта.--notest
возможностью фактически переименовать файлы.Я предполагаю, что вы имеете в виду, что вы хотите пересечь файловую систему и исправить все такие файлы?
Вот как я это сделаю
Это позволит найти все файлы с символами не ascii и заменить эти символы подчеркиванием (
_
). Однако будьте осторожны, если файл с новым именем уже существует, он будет перезаписан. Сценарий может быть изменен для проверки такого случая, но я не включил его, чтобы сделать его простым.источник
Следующие ответы на https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters , вы можете использовать:
где
*
совпадает с файлами, которые вы хотите переименовать. Если вы хотите сделать это через несколько каталогов, вы можете сделать что-то вроде:Вы можете использовать аргумент -n,
rename
чтобы выполнить пробный прогон и посмотреть, что изменится, не меняя его.источник
У меня были некоторые японские файлы со сломанными именами файлов, извлеченные из сломанной флешки, и приведенные выше решения не помогли мне.
Я рекомендую пакет детоксикации:
Пример использования:
источник
detox
прежде чем изобретать велосипед. Если вы посмотрите на справочную страницу, то увидите, что она охватывает все другие предлагаемые решения из-за своей гибкости.的节奏啊
, но эти символы являются допустимым именем файла.Этот сценарий оболочки рекурсивно очищает каталог, чтобы сделать файлы переносимыми между Linux / Windows и FAT / NTFS / exFAT. Он удаляет управляющие символы
/:*?"<>\|
и некоторые зарезервированные имена Windows, такие какCOM0
.Linux менее ограничен в теории (
/
и\0
строго запрещен в именах файлов), но на практике несколько символов мешают командам bash (например*
...), поэтому их также следует избегать в именах файлов.Прекрасные источники для ограничений именования файлов:
источник
Если вы хотите работать со встроенными символами новой строки, многобайтовыми символами, пробелами, начальными чертами, обратными слешами и пробелами, вам понадобится что-то более надежное, см. Этот ответ:
https://superuser.com/a/858671/365691
Я разместил скрипт на code.google.com, если кому-то интересно: rnf-bash-rename-script
источник
Я использую эту строку для удаления недопустимых символов в файлах субтитров:
Он работает для нормализации имен каталогов фильмов:
Те же шаги, что и выше, но я добавил еще одну команду sed для удаления точки в конце каталога
X-Men Days of Future Past (2014) [1080p]
Изменено на:
X-Men.Days.of.Future.Past.2014.1080p
источник
для файла в *; do mv "$ file" $ (повторить "$ file" | sed -e 's / [^ A-Za-z0-9. -] / / g'); сделанный &
источник