2016-08-02 100 views
1

我試圖用非空的所有文件夾生成txt。Bash - 用特殊字符導出txt

的問題是,這些文件夾的名稱有「特殊字符」,所以不是上市「Começo」被拯救「Começo」(作爲一個例子)

我讀過有關的iconv,但從我讀的這是一個「轉換器」,我不想「轉換」文件,我想將它們保存在正確的形式,而不需要轉換後。

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

通過」 導出TXT所有文件夾......「你的意思是」用所有文件夾的文件名生成一個文本文件...「?此外,我們正在談論Linux,不是嗎? – leonbloy

+0

是的,你確實想轉換一個文件,即包含所有這些名稱的文本文件。 – Siguza

+0

@leonbloy是的,生成一個txt文件,在目錄中包含所有非空文件夾。 – blocnt

回答

2

應該沒有問題。 Linux中的文件名只是一個bytes的數組,除非必要,否則它們不會被解釋爲文本(即解碼)。而在你的情況下,他們不是。

[[email protected] t]$ ls 
Começo xx 
[[email protected] t]$find . -type d 
. 
./Começo 
./xx 
[[email protected] t]$ find . -type d -exec bash -c 'echo ${0#/Folder/}' {} \; 
. 
./Começo 
./xx 
[[email protected] t]$ find . -type d -exec bash -c 'echo ${0#/Folder/}' {} \; > list.txt 
[[email protected] t]$ cat list.txt 
. 
./Começo 
./xx 
[[email protected] t]$ od -c list.txt 
0000000 . \n . / C o m e 303 247 o \n . / x x 
0000020 \n 
0000021 

我們可以推斷,從od輸出,即,因爲我的Linux會議上有一個UTF-8的locale編碼,文件名是內部使用UTF-8編碼(7個字節)表示。

重要的是要明白,作爲lsfind命令只是吐字節序列而不將它們解碼爲文本,這只是控制檯的工作(在我的情況下,在UTF-8中,所以我看到它們好)。關於生成的文件list.txt也是如此,其中我們只有對應於文件名的原始字節。而且,再次,我看到他們確定當我cat它,因爲(並且只是因爲)我的控制檯有適當的編碼(UTF-8)。

只有當我嘗試在其他環境中看到文件時,其他語言環境的控制檯或試圖將其讀取爲ISO-8859-1或其他編碼的文本查看器編輯器時,我會看到「奇怪的字符「

[[email protected] t]$ cat list.txt 
. 
./Começo 
./xx 

(我的控制檯編碼設置爲ISO-8859-1之後 - 在我的情況,Konsole->設置 - >編輯配置文件 - >高級 - >編碼)

+0

謝謝你的解釋:) – blocnt