如何在macOS上使用find命令查找含不可打印字符的文件名?
macOS下用
find匹配含特殊字符的文件问题解决 macOS中,文件夹的自定义图标会存储在名为Icon?的文件里,这里的?实际是CR字符(十六进制0d),终端和访达中通常显示为?。通过十六进制打印可确认:
$ ls -l1 Icon* | xxd 00000000: 4963 6f6e 0d0a Icon..
其中0d是文件名末尾的CR字符,0a是ls输出的换行符(LF)。
尝试用find的正则匹配这类文件时,直接用\x0d或\r的写法无法生效:
# 无法找到目标文件 find -E . -iregex ".*/Icon\x0d" find -E . -iregex ".*/Icon\r"
仅用通配符.能匹配,但无法精准定位特殊字符;甚至用\x49(字符I的十六进制编码)的正则也失效:
# 同样无法生效 find -E . -iregex ".*/\x49con."
解决方法
macOS使用的是BSD版本find,其正则引擎不支持直接解析\xHH或\r这类转义序列,需要通过shell层面转义生成实际字符后再传给find:
直接在终端输入特殊字符
输入命令时,先输入find -E . -iregex ".*/Icon",然后按下Ctrl+V再按Ctrl+M(生成CR字符,终端显示为^M),最终命令为:find -E . -iregex ".*/Icon^M"使用shell的ANSI-C转义(bash/zsh适用)
用$''包裹正则表达式,让shell先解析转义字符为实际字节:# 匹配带CR的Icon文件 find -E . -iregex $'.*/Icon\r' # 用十六进制匹配字符I+con+CR find -E . -iregex $'.*/\x49con\x0d' # 测试匹配名为"a"的文件 find -E . -iregex $'.*/\x61'通过
printf生成正则字符串
利用printf解析十六进制或转义字符,再传递给find:# 匹配Icon+CR find -E . -iregex "$(printf '.*/Icon\r')" # 匹配\x49con+\x0d find -E . -iregex "$(printf '.*/\x49con\x0d')"
内容的提问来源于stack exchange,提问作者Thomas Tempelmann
相关产品推荐
相关产品推荐

