在我们的一个服务器(IBM AIX)中,我们有一个path/ data / 1002 /中的文件,我们无法使用“rm”命令删除或删除这些文件。 我们得到的错误信息是“rm:S1208001.002:path名中的文件或目录不存在”。
使用“-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
我如何删除这个虚假的fie?
谢谢。
更新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
这听起来像这个文件名可能包含一个不可打印的字符。 这将解释“触摸”做出不同的文件。
尝试类似
ls -b
在目录中查看是否是这种情况?
那么你应该能够做到这样的事情:
rm -i S*2
即使隐藏字符也应该提示您input文件。
或者,你也许可以使用find来做到这一点…
find . -name S\*2 -exec /bin/rm -i {} \;
应该提示你input文件…我不知道AIX的'find'语法是不是很常见,所以这可能不起作用,但'rm -i'部分应该让你在命令出错的时候中止。
你可以尝试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.
文件末尾有一个空格(或其他一些不可打印的字符)。 尝试在$ ls -l输出中select两行来查看它。 要删除它,你可以尝试完全安全的查找方法:
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 )
那么你可以在while循环结尾添加一个rm -- "${file_path}" 。
可能文件系统保存文件,直到最后一个进程停止使用它,或者直到fs清除。
我在NFS上看到了一些类似的NetApp-Shares。 等一下,文件就消失了。
我遇到过类似的问题,简单的fsck(然后rm)解决了我的问题