Bash

辨識文件名中包含非 ASCII 或不可列印字元的文件

  • October 9, 2019

在大約 700,000 個文件的 80GB 大小的目錄中,文件名中有一些文件名帶有非英文字元。除了費力地瀏覽文件列表之外,還有:

  • 列出或以其他方式辨識這些文件名的簡單方法?
  • 一種生成可列印非英語語言字元的方法 - 那些未列在可列印範圍內的字元man ascii(因此我可以測試這些文件是否被辨識)?

假設“外來”表示“不是 ASCII 字元”,那麼您可以使用find模式來查找所有名稱中沒有可列印 ASCII 字元的文件:

LC_ALL=C find . -name '*[! -~]*'

(空格是http://www.asciitable.com/上列出的第一個可列印字元,~是最後一個。)

的提示LC_ALL=C是必需的(實際上,LC_CTYPE=CLC_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
./π

引用自:https://unix.stackexchange.com/questions/109747