Bash - 导出带有特殊字符的 txt
Bash - export txt with special characters
我正在尝试生成包含所有非空文件夹的 txt。
问题是这些文件夹的名称有 "special characters",所以不是列出 "Começo" 而是保存 "Começo"(作为示例)
我读过有关 iconv 的内容,但从我读到的内容来看,这是一个 "conversor",我不想 "convert" 文件,我想以正确的形式保存它们而不之后转换。
find /SubFolder/* -type d -not -empty -exec bash -c 'echo ${0#/Folder/}' {} \; > /Folder/NotEmpty.txt
应该没有问题。 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 字节)表示。
重要的是要理解 ls
和 find
的命令只是吐出字节序列而不是 "decoding" 它们作为文本,这只是控制台的工作(在我的在 UTF-8 中的情况下,所以我认为它们没问题)。对于生成的文件 list.txt
也是如此,在它里面我们只有与文件名对应的原始字节。而且,当我 cat
它时,我再次看到它们正常,因为(并且仅因为)我的控制台具有正确的编码 (UTF-8)。
只有当我尝试在其他环境、具有其他语言环境的控制台或尝试将其读取为 ISO-8859-1 或其他编码的文本查看器-编辑器中查看文件时,我才会看到 "strange characters"
[test@localhost t]$ cat list.txt
.
./Começo
./xx
(将我的控制台编码设置为 ISO-8859-1 后 - 在我的例子中,Konsole->设置->编辑配置文件 -> 高级 -> 编码)
我正在尝试生成包含所有非空文件夹的 txt。
问题是这些文件夹的名称有 "special characters",所以不是列出 "Começo" 而是保存 "Começo"(作为示例)
我读过有关 iconv 的内容,但从我读到的内容来看,这是一个 "conversor",我不想 "convert" 文件,我想以正确的形式保存它们而不之后转换。
find /SubFolder/* -type d -not -empty -exec bash -c 'echo ${0#/Folder/}' {} \; > /Folder/NotEmpty.txt
应该没有问题。 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 字节)表示。
重要的是要理解 ls
和 find
的命令只是吐出字节序列而不是 "decoding" 它们作为文本,这只是控制台的工作(在我的在 UTF-8 中的情况下,所以我认为它们没问题)。对于生成的文件 list.txt
也是如此,在它里面我们只有与文件名对应的原始字节。而且,当我 cat
它时,我再次看到它们正常,因为(并且仅因为)我的控制台具有正确的编码 (UTF-8)。
只有当我尝试在其他环境、具有其他语言环境的控制台或尝试将其读取为 ISO-8859-1 或其他编码的文本查看器-编辑器中查看文件时,我才会看到 "strange characters"
[test@localhost t]$ cat list.txt
.
./Começo
./xx
(将我的控制台编码设置为 ISO-8859-1 后 - 在我的例子中,Konsole->设置->编辑配置文件 -> 高级 -> 编码)