You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:

  1. 直接在终端输入特殊字符
    输入命令时,先输入find -E . -iregex ".*/Icon",然后按下Ctrl+V再按Ctrl+M(生成CR字符,终端显示为^M),最终命令为:

    find -E . -iregex ".*/Icon^M"
    
  2. 使用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'
    
  3. 通过printf生成正则字符串
    利用printf解析十六进制或转义字符,再传递给find:

    # 匹配Icon+CR
    find -E . -iregex "$(printf '.*/Icon\r')"
    # 匹配\x49con+\x0d
    find -E . -iregex "$(printf '.*/\x49con\x0d')"
    

内容的提问来源于stack exchange,提问作者Thomas Tempelmann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:50:13