Bash - экспорт txt со спецсимволами
Я пытаюсь сгенерировать текст со всеми папками, которые не являются пустыми.
Проблема в том, что в названии этих папок есть "специальные символы", поэтому вместо списка "Começo" сохраняется "Começo" (в качестве примера).
Я читал о iconv, но из того, что я прочитал, это "собеседник", и я не хочу "конвертировать" файлы, я хочу сохранить их в нужной форме без конвертации после.
find /SubFolder/* -type d -not -empty -exec bash -c 'echo ${0#/Folder/}' {} \; > /Folder/NotEmpty.txt
1 ответ
Там должно быть никаких проблем. Имя файла в Linux - это просто массив байтов, они не интерпретируются как текст (то есть декодируются) без необходимости. А в твоем случае это не так.
Например
[test@localhost t]$ ls
Começo xx
[test@localhost t]$find . -type d
.
./Começo
./xx
[test@localhost t]$ find . -type d -exec bash -c 'echo ${0#/Folder/}' {} \;
.
./Começo
./xx
[test@localhost t]$ find . -type d -exec bash -c 'echo ${0#/Folder/}' {} \; > list.txt
[test@localhost t]$ cat list.txt
.
./Começo
./xx
[test@localhost t]$ od -c list.txt
0000000 . \n . / C o m e 303 247 o \n . / x x
0000020 \n
0000021
Мы можем вывести, из od
вывод, что, поскольку мой сеанс Linux имел кодировку локали UTF-8, имя файла было внутренне представлено кодировкой UTF-8 (7 байт).
Важно понимать, что команды как ls
а также find
просто выплевывает эту последовательность байтов, не "декодируя" их как текст, это просто работа консоли (что в моем случае включено в UTF-8, так что я вижу их в порядке). То же самое можно сказать и о сгенерированном файле. list.txt
внутри него есть только необработанные байты, соответствующие именам файлов. И, опять же, я вижу их в порядке, когда я cat
это потому, что (и только потому, что) моя консоль имеет правильную кодировку (UTF-8).
Только если я попытаюсь увидеть файл в другом окружении, консоль с другой локалью или какой-нибудь текстовый редактор-редактор, который попытается прочитать его как ISO-8859-1 или другую кодировку, я увижу "странные символы"
[test@localhost t]$ cat list.txt
.
./Começo
./xx
(После настройки кодировки консоли на ISO-8859-1 - в моем случае Konsole-> Настройки-> Изменить профиль -> Дополнительно -> Кодировка)