在我们的一台服务器 (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)解决了我的问题