find . -regextype "posix-extended" -regex "./[^x{4e00}-x{9fa5}]+.*"
此指令在 Ubuntu 14.04 上能匹配「含有漢字」的檔名,而直覺上 [x{4e00}-x{9fa5}] 才是漢字區間。
[^...] 的字元類別語義在 POSIX Extended Regular Expression(ERE)規範中,[^...] 內的 x{XXXX} 不代表 Unicode 碼位,而是被視為字面字元序列:x、{、4、e、0、0、}。因此 [^x{4e00}-x{9fa5}] 實際意義是:
「不包含字元x、{、4、e、0、}、-、9、f、a、5的任意單一字元」
中 = E4 B8 AD),不含上述任何單一 ASCII 字元。abc.txt)包含 a、b、c 等,a 不在排除集合中,但 b、c 也不在,理論上也會匹配——實測顯示行為取決於 find 對多位元組字元的逐位元組比對邏輯與當前 locale(LC_CTYPE)。find 在 zh_TW.UTF-8 locale 下將多位元組字元視為「非單一字節字元」的特性,並非可靠的漢字檢測方式。grep -P(PCRE)支援 Unicode 屬性find . -type f -print0 | grep -zP '[\p{Han}]' | tr '\0' '\n'
\p{Han} 精確匹配所有漢字(CJK Unified Ideographs)。
python3 -c "
import sys, os, re
for root,_,files in os.walk('.'):
for f in files:
if re.search(r'[\u4e00-\u9fa5]', f):
print(os.path.join(root, f))
"
# 僅示意,實際需視 locale 與 find 版本而定
find . -regextype posix-extended -regex '.*[\x80-\xFF].*'
匹配含非 ASCII 位元組的檔名,間接涵蓋 UTF-8 漢字(但也會誤判日文假名、韓文諺文等)。
原指令之所以「能用」,是 POSIX ERE 對 x{XXXX} 不支援 Unicode 轉義、加上 find 多位元組處理的副作用,屬於未定義/實作相關行為。生產環境請改用 PCRE 或程式語言的 Unicode 正則,確保語義明確、跨平台一致。