无法使用‘rm’删除文件

无法使用‘rm’删除文件

在我们的一台服务器 (IBM AIX) 中,路径 /data/1002/ 中有一个文件,我们无法使用 'rm' 命令移除或删除它。我们收到的错误消息是“rm: S1208001.002: 路径名中的文件或目录不存在。”

使用“-f”选项时,没有显示任何错误消息,但文件仍然存在。

该文件的大小为“0”字节,当我使用命令“touch S120801.002”时,我在该目录中看到两个具有相同文件名的文件。

目录列表如下:

$ ls -l total 56
-rwxrwxrwx    1 oracle   dba               0 Feb 09 11:57 S1208001.002 
drwxrwxrwx    4 nobody   dba           24576 Feb 09 13:36 backup

我该如何删除这个虚假文件?

谢谢。

更新 1

使用touch命令后,目录列表如下:

$ ls -l total 56
-rwxrwxrwx    1 oracle   dba               0 Feb 09 11:57 S1208001.002 
-rwxrwxrwx    1 oracle   dba           77790 Feb 09 14:30 S1208001.002
drwxrwxrwx    4 nobody   dba           24576 Feb 09 13:36 backup

答案1

听起来这个文件名可能包含不可打印的字符。这可以解释“touch”创建了不同的文件。

尝试类似

       ls -b

在目录中查看是否是这种情况?

然后你应该能够做类似的事情:

       rm -i S*2 

即使文件包含隐藏字符,它也会提示你输入文件。

或者,您也可以使用 find 来执行此操作...

       find . -name S\*2 -exec /bin/rm -i {} \;

应该提示您输入文件...我不知道 AIX 的“find”语法是否不寻常,所以这可能不起作用,但如果命令错误,“rm -i”部分应该允许您中止该命令。

答案2

您可以尝试使用 inode。我不确定您在那里使用了什么特殊字符,但这可能值得一试:

$ touch badfile^M
$ ls -il bad*
   99 -rw-r--r--    1 username  group               0 Feb 09 04:39 badfile
$ find . -inum 99 -exec /bin/rm {} \;
$ ls -li bad*
ls: 0653-341 The file bad* does not exist.

答案3

文件末尾有一个空格(或其他一些不可打印的字符)。请尝试选择$ ls -l输出中的两行来查看它。要删除它,您可以尝试完全安全的发现方法:

dir=/path/to/your/directory

absolute_dir_path_x="$(readlink -fn -- "$dir"; echo x)"
absolute_dir_path="${absolute_dir_path_x%x}"

while IFS= read -rd $'\0' path
do
    file_path="$(readlink -fn -- "$path"; echo x)"
    file_path="${file_path%x}"
    echo "START${file_path}END"
done < <( find "$absolute_dir_path" -type f -name '*S1208001*' -print0 )

然后您可能只需rm -- "${file_path}"在 while 循环末尾添加一个。

答案4

我遇到过类似的问题,一个简单的 fsck(然后再次 rm)解决了我的问题

相关内容