在 OS X 中删除文件名中含有奇怪字符的文件

在 OS X 中删除文件名中含有奇怪字符的文件

在我的程序发生内存错误后,我被一个文件名奇怪的文件困住了。事实证明,它对所有删除文件名奇怪的文件的常规方法都具有很强的抵抗力。

文件名为:

%8BUȅ҉%95d%F8%FF%FF\x0f%8E%8F%FD%FF%FF%8B%B5T%F8%FF%FF%8B%85\%F8%FF%FF\x03%85x%F8%FF%FF%8B%95D%F8%FF%FF%8B%BD%9C%F8%FF%FF%8D\x04%86%8B%B5@%F8%FF%FF%89%85%90%F8%FF%FF%8B%85X%F8%FF%FF\x03%85%9C%F8%FF%FF%C1%E7\x02%8B%8Dx

我尝试了以下操作:

  • rm *
      No such file or directory
  • rm -- filename
      No such file or directory
  • rm "filename"
      No such file or directory
  • ls -i获取 inode 编号
      No such file or directory
  • stat filename
      No such file or directory
  • 压缩文件所在目录
      error occurred while adding "" to the archive
  • 在 Finder 中删除目录
      error -43
  • 在 Python 中: os.unlink(os.listdir(u'.')[0])
      OSErrorNo such file or directory
  • find . -type f -exec rm {} \;
      No such file or directory
  • 检查文件上的锁lsof
      no locks

所有这些尝试都会导致文件(此处为长文件名)未找到错误,或错误 -43。即使ls -i

我找不到任何其他选项,因此在重新格式化或修复我的文件系统(fsck可能会有帮助)之前,我想也许我错过了一些东西。

我编写了这个小型 C 程序来获取 inode 编号:

#include <stdio.h>
#include <stddef.h>
#include <sys/types.h>

int main(void) 
{
  DIR *dp;
  struct dirent *ep;

  dp = opendir ("./");
  if (dp != NULL)
    {
      while (ep = readdir (dp)) {
        printf("d_ino=%ld, ", (unsigned long) ep->d_ino);
        printf("d_name=%s.\n", ep->d_name);
      }
      (void) closedir (dp);
    }
  else
    perror ("Couldn't open the directory");

  return 0;
}

可以了。我现在有 inode 编号,但常规方法不起作用。我想我必须使用现在的方法。find -inum inode_num -exec rm '{}' \;clri

答案1

尝试

find . -type f -exec rm {} \;

您是否尝试过删除父目录?

答案2

我通常在 emacs dired 模式下打开封闭文件夹,然后标记并删除。

答案3

假设文件系统不是 JHFS+

这些症状可能表明存在正常化问题。

在 ZEVO 支持论坛中,NFD:normalization=formD(规范化形式 D)包括 2012 年 Illumos ZFS 日小组讨论的部分记录:

… 微妙的错误,我觉得没有人会理解我的痛苦。就像在 Unicode 空间中实际上有存储多个字符的不同方法——比如é在 Mac 上,传统上存储为´角色。渲染时,它们会将它们合成。

在任何其他平台上...存储复合字符...一次单击,一个字符。

因此,在 Mac 上,如果不进行干预,您可能会遇到一些棘手的问题,因为 Finder 会以一种方式存储它,而 Terminal 会选择另一种方式。因此,您实际上可以进入 Finder 并创建一个目录 - café - 然后进入 Terminal 并

touch café

那么你就有两个对象——一个目录和一个同名的文件,也就是说,它会导致各种各样的……(!)……它 看起来相同但不同之处是…… 没有什么就像,在 Finder 中,根据 Finder 视图的不同,您会获得不同的体验。有时您会看到两个文件夹,有时您会看到一个文件夹和一个文件,有时您会看到一个文件夹。这很奇怪。不幸的是……

…有一个 formD-explicit 设置,因此在 Mac 上我们高度建议,事实上这是默认的,你应该使用 formD,然后 问题是,你不能这样做——当你这样做触碰它实际上会将其映射回正确的方式。

你付出了一点开销,但可以保持理智。使用不同的编码变体来构建不同的堆栈是疯狂的。

– http://www.ustream.tv/recorded/25862520时间线上大约是 00:10:33。

答案4

我找不到任何选项,所以在重新格式化或修复我的文件系统(fsck 可能会有帮助)之前,我想也许我错过了一些东西。

不,你已经很彻底了。看起来文件系统的某个部分有问题。你可以修复它。或者你可以想想你想做什么其他有趣的事情。不过,最简单的事情就是修复它。

您可能不愿意修复文件系统,这是理所当然的:修复可能会带来灾难性后果,虽然可能性很小,但确实存在。保护自己免受灾难性后果的最佳方法是备份所有重要数据。修复文件系统之前,请确保备份完好无损。

然后,开始修复。当你知道该怎么做时,有时你只需要继续下去的勇气。你可能会发现这个问题在半秒钟内就完全解决了。(或者如果有一些开销,可能需要更长的时间……3 秒钟。)

请注意,处理损坏的数据也可能会引发进一步的文件系统问题,因此如果您想确保安全,那么安全的做法是执行初步检查(您已经做过了),然后再处理问题(验证备份后)。

相关内容