Как переименовывать файлы с недопустимым кодированием или навалом-заменить неверные кодированные символы?

У меня есть сервер debian, и я принимаю музыку для интернет-радиостанции. У меня проблемы с именами и путями файлов, потому что многие файлы получили недопустимую кодировку, например:

./music/Bändname - Some Title - additional Info/B ndname - 07 - This Title Is Cörtain, The EncÃding Not.mp3 

В идеале я хотел бы удалить все, что не является буквами AZ / az или цифрами 0-9 или тире - / underscore _ … Результат должен выглядеть примерно так:

 ./music/Bndname-SomeTitle-additionalInfo/Bndname-07-ThisTitleIsCrtain,TheEncdingNot.mp3 

Как добиться этого для партии большого количества файлов и каталогов?

Я видел этот похожий вопрос: объемные переименовать (или правильно отображать) файлы со специальными символами

Но это только исправляет кодировку, я бы предпочел более строгий подход, как описано выше.

3 Solutions collect form web for “Как переименовывать файлы с недопустимым кодированием или навалом-заменить неверные кодированные символы?”

Если вы хотите переименовать файлы и каталоги одновременно, у вас возникнут некоторые проблемы. Переименование только файла достаточно просто. Но вы хотите убедиться, что каталоги также переименованы. Вы не можете просто mv Motörhead/Encöding Motorhead/Encoding поскольку Motorhead не будет существовать во время разговора.

Итак, нам нужно пройти сначала по глубине всех файлов и папок, а затем переименовать только текущий файл или папку. Следующее работает с GNU find и Bash 4.2.42 на моей ОС X:

 #!/usr/bin/env bash find "$1" -depth -print0 | while IFS= read -r -d '' file; do d="$( dirname "$file" )" f="$( basename "$file" )" new="${f//[^a-zA-Z0-9\/\._\-]/}" if [ "$f" != "$new" ] # if equal, name is already clean, so leave alone then if [ -e "$d/$new" ] then echo "Notice: \"$new\" and \"$f\" both exist in "$d":" ls -ld "$d/$new" "$d/$f" else echo mv "$file" "$d/$new" # remove "echo" to actually rename things fi fi done 

Сохраните этот скрипт как rename.sh , сделайте его исполняемым с помощью chmod +x rename.sh . Затем назовите его как rename.sh /some/path . Разрешить любые конфликты имен файлов ( Notice « Notice »).

Если вы абсолютно уверены, что он делает правильные замены, удалите echo из сценария, чтобы фактически переименовать вещи, а не просто печатать, что он делает.

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


Опции объяснены

Объяснить, что здесь происходит:

  • -depth гарантирует, что каталоги будут перегружены по глубине, поэтому мы сможем «свернуть» все с самого конца. Обычно, find траверсы по-разному (но не по ширине).
  • -print0 гарантирует, что вывод find будет нулевым, поэтому мы можем прочитать его с read -d '' в file переменной. Это помогает нам иметь дело со всеми видами странных имен файлов, в том числе с пробелами и даже с символами новой строки.
  • Мы получим каталог файла с dirname . Не забывайте всегда правильно указывать свои переменные, иначе любой путь с пробелами или символами глобуса нарушил бы этот скрипт.
  • Мы получим фактическое имя файла (или имя каталога) с basename именем.
  • Затем мы удаляем любой недопустимый символ из $f используя возможности замены строки Bash. Недопустимый означает все, что не является буквой нижнего или верхнего регистра, цифрой, косой чертой ( \/ ), точкой ( \. ), Подчеркиванием или минус-дефисом.
  • Если $f уже чист (очищенное имя совпадает с текущим именем), пропустите его.
  • Если $new уже существует в каталоге $d (например, у вас есть файлы с именем resume и résumé в том же каталоге), выпустите предупреждение. Вы не хотите переименовывать его, потому что в некоторых системах mv foo foo вызывает проблему. В противном случае,
  • Наконец, мы переименуем исходный файл (или каталог) в новое имя

Поскольку это будет действовать только в самой глубокой иерархии, переименование Motörhead/Encöding в Motorhead/Encoding выполняется в два этапа:

  1. mv Motörhead/Encöding Motörhead/Encoding
  2. mv Motörhead Motorhead

Это гарантирует, что все замены выполняются в правильном порядке.


Примеры файлов и тестовый прогон

Предположим, что некоторые файлы в базовой папке называются test :

 test test/Motörhead test/Motörhead/anöther_file.mp3 test/Motörhead/Encöding test/Randöm test/Täst test/Täst/Töst test/with space test/with-hyphen.txt test/work test/work/resume test/work/résumé test/work/schedule 

Вот результат запуска в режиме отладки (с echo перед mv ), то есть с командами, которые будут вызываться, и предупреждениями о столкновении:

 mv test/Motörhead/anöther_file.mp3 test/Motörhead/another_file.mp3 mv test/Motörhead/Encöding test/Motörhead/Encoding mv test/Motörhead test/Motorhead mv test/Randöm test/Random mv test/Täst/Töst test/Täst/Tost mv test/Täst test/Tast mv test/with space test/withspace Notice: "resume" and "résumé" both exist in test/work: -rw-r—r-- … … test/work/resume -rw-r—r-- … … test/work/résumé 

Обратите внимание на отсутствие сообщений для with-hyphen.txt , schedule и test .

Я знаю, что это не совсем то, что вы хотели, но если вы знаете исходную кодировку, возможно, вы можете использовать convmv для изменения кодировки в UTF-8, что должно устранить большинство проблем.

Это работало для меня в папке с некорректными кодированными польскими именами файлов:

 convmv -f cp1250 -t utf8 -r . 

Обратите внимание, что эта команда фактически ничего не переименовывает; Add --notest чтобы действительно переименовать файлы.

Я знаю, вы спрашивали о переименовании.

Но вы можете легко избавиться от проблемы с помощью программного обеспечения, такого как MusicBrainz Picard .

Он способен идентифицировать музыку (звуковое отпечатки пальцев), загружать все необходимые данные (включая обложки, если они есть) из огромной базы данных MusicBrainz и перемещать файлы, чтобы ваша коллекция могла соответствовать любому шаблону, который вам нравится. Я использую его в течение многих лет, и он всегда отлично работал с чем угодно – от кириллицы до арабского; И, конечно, (по крайней мере, для латинских скриптов), он также может преобразовать в ASCII.

При таком подходе на самом деле не имеет значения, насколько беспорядочно или плохо названа ваша коллекция, если файлы читаемы и полны.

(Я упоминал, что это бесплатно? Как в свободной речи, так и в бесплатном пиве? И программное обеспечение, и база данных ..?)

  • X на одном мониторе, голый терминал tty на другом? (Linux)
  • Как надежно сохранить SSH-туннель открытым?
  • Как загрузить локальные измененные файлы на FTP-сервер?
  • Беспроводное соединение Deskjet 2540 Linux
  • Как вы отслеживаете, какие пакеты были установлены на Fedora (Linux)?
  • Инструменты Unix: что, если файл называется минусом?
  • Каковы пределы команды whois для unix?
  • Почему я должен использовать sudo для проверки подлинности открытого ключа ssh?
  • Сервер OpenVPN не предоставляет доступ к Интернету
  • Что такое файловая система, которая имеет r / w на всех основных операционных системах
  • Как полностью отключить процесс от терминала?
  • Interesting Posts

    Почему оператор условного оператора является ассоциативным?

    Vista & XP Dual Boot – удаление XP

    Как ускорить мой компьютер для просмотра нескольких вкладок?

    Отслеживание дискового ввода-вывода приложением в Windows?

    Сохранить изображение в папку документов приложений из UIView на IOS

    Бенчмаркинг кода VBA

    Сжатие раздела exFAT

    Хранение изображения в базе данных напрямую или как данные base64?

    Как получить активные размеры экрана?

    Как установить программы на альтернативный диск?

    Нормализация: что означает «повторяющиеся группы»?

    Есть ли способ заставить отчет сообщить размер каталога (рекурсивно), включая только размеры файлов?

    Как избежать утечек памяти при использовании вектора указателей на динамически выделенные объекты в C ++?

    В Java можно определить целочисленную константу в двоичном формате?

    Как создать несколько разделов на USB-накопителе

    Давайте будем гением компьютера.