【问题标题】:Find files with special character in file-name in unix在unix中查找文件名中具有特殊字符的文件
【发布时间】:2025-12-24 15:00:11
【问题描述】:

问:我在 unix 平台上使用脚本,我必须找出一个目录中的所有文件,该目录从现在开始大约 8 小时。

我正在使用以下命令按照上述条件检索文件:

find . name "*.dat" -mmin -480

但是很少有文件在文件名本身中有特殊字符(双问号)??" 并使用上面的命令,文件名中带有?? 的文件被分成两行两部分.

例如:

file name : aabb??cc.dat

上面的命令运行后,结果如下:

$./aabb

$cc.dat

($这里是unix命令提示符) 有人可以建议上述命令中的更正或处理此异常的正确方法。

【问题讨论】:

  • find 不会拆分文件名。显示脚本的其余部分。
  • 没有“特殊字符”这样的东西。只有字符。很多这样的虫子。
  • @MarcB 我在这里的目的不是拆分文件。我想在具有完整文件名的目录中搜索文件,但此文件(aabb??cc.dat)拆分为两个名称,这对我来说是个问题。
  • 然后显示文件名是如何被分割的。 find 不会拆分文件名,所以它一定是你正在做的事情。
  • 你在哪里看到问号?在文件中还是在终端中?您的终端是否以 UTF-8 作为其代码集运行?如果是这样,则使用其他代码集(例如 ISO 8859-15)创建的文件名将无法正确显示。我认为您应该通过十六进制转储程序(或od -c,或类似的东西)运行find 的输出,并查看它标识问号出现位置的字节。这可能会告诉你很多关于这个问题的信息。 0x80..0xC1 或 0xF5..0xFF 范围内的字节尤其成问题。如果 UTF-8 是一个因素,任何超过 0x80 的字节都可能成为问题。

标签: shell unix sh ksh


【解决方案1】:

此命令将显示find 正在像其他文件一样考虑这些文件:

find . -name "*.dat" -mmin -480 -exec \
  ksh -c 'c=1
          for file do
              printf "file #%d is \"%s\"\n" $c "$file"
              c=$((c+1))
          done ' sh {} +

如果find 显示一些文件名分成两行,那只是因为它们的名称有一个嵌入的新行。这很奇怪,但它们仍然是有效的文件名。

【讨论】:

  • for file do printfdo 之前至少需要一个分号。该脚本无法阅读,因为它绵延数英里。
  • @JonathanLeffler 我的理解是根据 POSIX for 循环语法不需要这样的分号。插入换行符以提高可读性。
  • 有趣。由于没有in 和参数列表(例如,没有for file in "$@";),分号似乎不是必需的,尽管它也不会造成任何伤害。我坐得更正了。
  • @JonathanLeffler 按照标准,分号在这里甚至是无效的。不过,没有主流的 posix shell 足够严格来拒绝它。