![bash - 以 . 和空格结尾的目录无法删除](https://linux22.com/image/1379490/bash%20-%20%E4%BB%A5%20.%20%E5%92%8C%E7%A9%BA%E6%A0%BC%E7%BB%93%E5%B0%BE%E7%9A%84%E7%9B%AE%E5%BD%95%E6%97%A0%E6%B3%95%E5%88%A0%E9%99%A4.png)
我的外部硬盘上有两个目录,Fun.
和Complex_
,其中 _ 是空格。我无法清空垃圾箱或使用rm -rf
和 删除它们。在 OSX 上,这两个目录都没有显示在 Finder 中,我不记得它们是否显示在 Linux 上的 dolphin 中。但它们确实显示在 bash 中。
rm
并mv
返回No such file or directory
。包含文件夹可以被移动并带走特殊目录,但不能被删除。
为什么可以ls
检测到文件但rm
不能mv
?我该如何修复它们?我正在\_
复杂文件上使用。(_ 是空格)。
编辑
字符肯定不是问题所在。我创建了“test.”和“test”,使用引号删除它们毫无困难。但这些目录仍然无法删除。实际文件本身肯定存在一些非常低级的错误
sagan:Math ptwales$ ls
Complex
sagan:Math ptwales$ ls -i
ls: Complex : No such file or directory
sagan:Math ptwales$ ls -idF *
ls: Complex : No such file or directory
sagan:Math ptwales$ find . -name * -print0
find: ./Complex : No such file or directory
sagan:Math ptwales$
结果相同,Fun.
我猜测父目录有文件链接并且知道它们的名称,但文件不存在或以某种方式损坏。
外部驱动器为 exFAT 格式。这有关系吗?
答案1
rm 和 mv 也可以很好地检测目录,但是如果您输入:rm file
那么 shell 将忽略空格。
有几种方法可以解决这个问题。最简单的方法是将文件名括在引号中。另一种解决方案是转义特殊字符,例如使用反斜杠
例子:
touch "testfile "
host:/home/username/test>ls -al
total 12
drwx------ 2 hennes users 4096 Sep 26 02:44 .
drwxr-xr-x 34 hennes users 8192 Sep 26 01:39 ..
-rw------- 1 hennes users 0 Sep 26 02:44 testfile
现在要删除它们,可以:
rm "testfile "
, 或者
rm testfile\
(请注意反斜杠后的空格)
至于以点结尾的文件名。我无法重现该问题。你确定它以点结尾而不是以其他特殊字符结尾吗?
toad:/home/hennes/test>bash --version GNU bash,版本 4.1.10(1)-发布(amd64-portbld-freebsd7.3) 版权所有 (C) 2009 自由软件基金会,Inc. 许可证 GPLv3+:GNU GPL 版本 3 或更高版本 这是免费软件;您可以自由更改和重新分发它。 在法律允许的范围内,不提供任何担保。 toad:/home/hennes/test>touch 有趣。 蟾蜍:/home/hennes/test>ls 乐趣。 toad:/home/hennes/test>rm 有趣。 蟾蜍:/home/hennes/test>ls 蟾蜍:/home/hennes/test>
如果它是一个字符而不是一个点,那么请阅读内部文件分隔符在 bash 中。您可以将其设置为其他值,或者只需使用 find 和 -print0 等命令即可。(示例find /path/to/search-name 'SomeFilePattern*' -print0 | some_command
)
答案2
我写了一个关于这个问题的答案一个相当类似的问题关于服务器故障。前提略有不同,但答案基本相同。
您可以组合ls -i
(或stat
同时打印 inode 编号) 和find -inum
。这适用于少量文件,出于某种原因,直接使用通配符是不可取的。下面的示例适用于目录,而 Server Fault 上的答案处理文件,但原理是一样的:使用 inode 编号来识别要执行某些操作的目录条目。
例如:
~$ ls -idF myweirddir
183435818 myweirddir/
~$ find . -inum 183435818 -exec mv -v '{}' 'delete-me' ';'
`./myweirddir' -> `./delete-me'
~$ ls -lA delete-me/
... check the contents ...
~$ rm -rf delete-me
~$
该答案也在 Server Fault 上,只有细微的差别,并且还有使用 find 和 stat 直接进行进程替换的替代变体,这可能并不适用于您的情况。如果您喜欢这里的答案,请考虑在 Server Fault 上投票。
答案3
这看起来像是一个损坏的文件系统或一个有缺陷的文件系统实现。
不幸的是外置FAT文件系统在非 Microsoft 系统上支持不佳。如果您有能力使用其他文件系统,请考虑。
请检查文件系统完整性。在 Linux 上,您可以通过运行 来检查 exFAT 完整性exfatfsck
。遗憾的是,此实用程序无法修复文件系统。在 Windows(更新了 KB955704 的 XP、Vista SP1 或更高版本)上,您可以使用chkdsk
来检查和修复文件系统。
答案4
当有一个文件具有一些您无法输入的奇怪名称时,您可以使用 bash 选择功能:
select f in * .*; do rm -i $f; done