Bash
辨識文件名中包含非 ASCII 或不可列印字元的文件
在大約 700,000 個文件的 80GB 大小的目錄中,文件名中有一些文件名帶有非英文字元。除了費力地瀏覽文件列表之外,還有:
- 列出或以其他方式辨識這些文件名的簡單方法?
- 一種生成可列印非英語語言字元的方法 - 那些未列在可列印範圍內的字元
man ascii
(因此我可以測試這些文件是否被辨識)?
假設“外來”表示“不是 ASCII 字元”,那麼您可以使用
find
模式來查找所有名稱中沒有可列印 ASCII 字元的文件:LC_ALL=C find . -name '*[! -~]*'
(空格是http://www.asciitable.com/上列出的第一個可列印字元,
~
是最後一個。)的提示
LC_ALL=C
是必需的(實際上,LC_CTYPE=C
和LC_COLLATE=C
),否則字元範圍被錯誤地解釋。另請參閱手冊頁glob(7)
。由於LC_ALL=C
導致find
將字元串解釋為 ASCII,它將列印多字節字元(例如π
)作為問號。要解決此問題,請通過管道傳輸到某個程序(例如cat
)或重定向到文件。代替指定字元範圍,
[:print:]
也可用於選擇“可列印字元”。一定要設置 C 語言環境,否則你會得到相當(看似)任意的行為。例子:
$ touch $(printf '\u03c0') "$(printf 'x\ty')" $ ls -F dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π $ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8) ./x?y ./dir ./π ... (a lot more) ./foo.c $ LC_ALL=C find . -name '*[! -~]*' ./x?y ./?? $ LC_ALL=C find . -name '*[! -~]*' | cat ./x y ./π $ LC_ALL=C find . -name '*[![:print:]]*' | cat ./x y ./π