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-> Настройки-> Изменить профиль -> Дополнительно -> Кодировка)

Другие вопросы по тегам