我正在尝试使用非空的所有文件夹生成一个txt。
问题是这些文件夹的名称有“特殊字符”,因此不是列出“Começo”正在保存“Começo”(作为示例)
我读过关于iconv的内容,但是从我读到的内容来看,这是一个“转换器”,我不想“转换”文件,我想以正确的形式保存它们而不进行转换。
find /SubFolder/* -type d -not -empty -exec bash -c 'echo ${0#/Folder/}' {} \; > /Folder/NotEmpty.txt
答案 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字节)。
重要的是要理解命令为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->设置 - >编辑个人资料 - >高级 - >编码)