Bash - 使用特殊字符导出txt

时间:2016-08-02 14:09:11

标签: bash find iconv

我正在尝试使用非空的所有文件夹生成一个txt。

问题是这些文件夹的名称有“特殊字符”,因此不是列出“Começo”正在保存“Começo”(作为示例)

我读过关于iconv的内容,但是从我读到的内容来看,这是一个“转换器”,我不想“转换”文件,我想以正确的形式保存它们而不进行转换。

 find /SubFolder/* -type d -not -empty  -exec bash -c 'echo ${0#/Folder/}'  {} \; > /Folder/NotEmpty.txt

1 个答案:

答案 0 :(得分:2)

应该没有问题。 Linux中的文件名只是bytes的数组,除非必要,否则它们不会被解释为文本(即解码)。在你的情况下,他们不是。

例如

[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字节)。

重要的是要理解命令为lsfind只是吐出那些字节序列而不将它们“解码”为文本,这只是控制台的工作(在我的情况下是UTF) -8,所以我看到它们好了)。关于生成的文件list.txt也可以这么说,在其中我们只有与文件名对应的原始字节。而且,当我cat时,我看到它们正常,因为(并且仅仅因为)我的控制台具有正确的编码(UTF-8)。

只有当我试图在其他环境中看到该文件,具有其他语言环境的控制台或某些文本查看器编辑器试图将其读作ISO-8859-1或其他编码时,我才会看到“奇怪的字符”

[test@localhost t]$ cat list.txt
.
./Começo
./xx

(将我的控制台编码设置为ISO-8859-1 - 在我的情况下,Konsole->设置 - >编辑个人资料 - >高级 - >编码)