Используй источник, Люк!
В исходном коде GNU найдите
(я смотрю версию 4.2.2), код, который просматривает деревья каталогов, находится в gnulib / lib / fts.c
. В строке 1123 есть следующий комментарий:
Запишите, что fts_read будет делать с этой записью . Во многих случаях он просто fts_stat , но мы можем воспользоваться любой информацией d_type , чтобы оптимизировать ненужные вызовы статистики. Т.е., если действует FTS_NOSTAT и мы не следуем символическим ссылкам (FTS_PHYSICAL), а d_type указывает, что этот не каталог, то мы выиграли мне вообще не нужно регистрировать это . Если это каталог, то (в настоящее время) мы его статизируем независимо от того, чтобы получить номера устройства и индексных дескрипторов. Когда-нибудь мы сможем оптимизировать и это для каталогов, где d_ino, как известно, является действительным.
Итак, они подумали об оптимизации, которую вы описываете, но она не реализована.
Да, есть несколько. Пакет coreutils
(, установленный по умолчанию в Debian ), содержит как base32 , так и base64 . Они могли либо кодировать, либо декодировать :
$ printf '%s' "abc" | base64
YWJj
$ printf '%s' "abc" | base64 | base64 -d
abc
Имейте в виду, что использование эха может добавить завершающую новую строку, которая изменит результирующую строку в кодировке base64:
$ echo "abc" | base64
YWJjCg==
Есть также другие пакеты, которые имеют аналогичные инструменты в пакетах basez
и openssl
. Последний также обычно устанавливается по умолчанию, первый — нет.
$ printf '%s' "abc" | openssl base64
YWJj
Тот факт, что исходная строка закодирована в любой локали (кодовой страницей ), не имеет отношения к кодировке base64. Программа base64 кодирует байты, а не символы.
$ printf '%s' "éäìǫ" | base64 | base64 -d
éäìǫ
Будет работать на любой системе точно так же. Ну, в любой здравомыслящей системе, в которой echo "éäìǫ"
также будет печатать éäìǫ
в командной строке.
Конечно, если исходная строка закодирована в одной системе, а затем декодирована в системе с другой локалью, вполне вероятно, что вы получите строку Mojibake . Это не проблема, которую нужно решить с помощью base64, это проблема, которую нужно решить, изменив кодировку строки. Вероятно, сiconv
.
$ echo -n "Москва" | base64 # in a utf8 locale
0JzQvtGB0LrQstCw
Однако в кириллической локали с iso889 -5 (возможно ru _RU.ISO -8859 -5 есть другие языки с кириллицей):
$ echo "0JzQvtGB0LrQstCw" | base64 -d
ааОбаКаВаА
$ echo "0JzQvtGB0LrQstCw" | base64 -d | iconv -f utf8 -t iso8859-5
Москва