Как я могу конвертировать имена файлов из Unicode в ASCII - PullRequest
4 голосов
/ 10 июня 2010

У меня есть куча музыкальных файлов в разделе NTFS, смонтированных в Linux, с именами файлов с символами Unicode.У меня возникают проблемы при написании сценария для переименования файлов, чтобы во всех именах файлов использовались только символы ASCII.Я думаю, что использование команды iconv должно работать, но у меня возникают проблемы с экранированием символов для команды 'mv'.

РЕДАКТИРОВАТЬ: не имеет значения, если нет прямой трансляции длясимволы Юникода.Я предполагаю, что я просто заменю их знаком "?"характер.

Ответы [ 3 ]

3 голосов
/ 25 апреля 2013

Иногда mv не сможет прочитать имя файла в оболочке, поэтому вы можете попробовать ссылку inode.

Чтобы получить индекс файла:

$ ls -il

Вывод будет примерно таким:

13377799 -rw-r--r--  1 draco  draco      11809 Apr 25 01:39 some_filename.ext
9340462  -rw-r--r--  1 draco  draco      81648 Apr 23 02:27 some_strange_filename.ext
9340480  -rw-r--r--  1 draco  draco       4717 Apr 23 03:54 yikes_?_oh_look_a_file_火

Затем используйте find, чтобы получить ваш файл и, возможно, используя код Python от Thanatos:

$ find . -inum 9340480 -exec ./unistrip.py {} \;

Вы также можете использовать приведенную выше команду с iconv в оболочке.

Надеюсь, это кому-нибудь поможет, и извините за любые ошибки [первый ответ].

2 голосов
/ 10 июня 2010

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

Вы можете изменить любой символ, не входящий в ASCII, на '?'используя утилиту переименования, распространяемую с Perl:

rename 's/[^ -~]/?/g' *

К сожалению, это заменяет многобайтовые символы на несколько символов '?В зависимости от используемой кодировки Unicode и используемых символов изменение регулярного выражения может помочь, например,

rename 's/[^ -~]{2}/?/g' *

для 2-байтовых символов.

2 голосов
/ 10 июня 2010

Я не думаю, что iconv имеет какие-либо возможности для замены персонажа.Это в Python может помочь:

#!/usr/bin/python
import sys

def unistrip(s):
    if isinstance(s, str):
        s = s.decode('utf-8')
    chars = []
    for i in s:
        if ord(i) > 0x7f:
            chars.append(u'?')
        else:
            chars.append(i)
    return u''.join(chars)

if __name__ == '__main__':
    print unistrip(sys.argv[1])

Затем вызовите как:

$ ./unistrip.py "yikes_?_oh_look_a_file_火"
yikes_?_oh_look_a_file_?

Также:

$ mv "yikes_?_oh_look_a_file_火" "`./unistrip.py "yikes_?_oh_look_a_file_火"`"

Сначала вы можете проверить это немного.Для больших операций перемещения рекомендуется создать список mv команд (т. Е. Написать код для написания сценария), так как вы можете просмотреть команды перемещения перед тем, как указывать их выполнение.

...