我有两个目录,它们的名称很奇怪,如下所示:
"?????+ "BizComponent
"?+ "BizComponent
,现在我尝试删除它们,但失败了。当我输入rm -r '
然后输入tab
时,它会给我:
"^J^I^I^I^I+ "BizComponent/BizComponent/
"^J+ "BizComponent/
然后,当我键入rm -r "^J^I^I^I^I+ "BizComponent/BizComponent/
时,它会给我没有这样的文件或目录
答案 0 :(得分:1)
问题在于您的文件名包含一个特殊字符,但这不一定是您看到的字符。示例(摘自here):
$ touch zzz yyy $'zzz\nyyy'
$ ls
yyy zzz zzz?yyy
如您所见,创建了带有新行的文件名,但是ls
将其打印为?
。那么我们如何删除呢?
方法1:
ls
可用的选项是--quoting-style=shell-escape
,这使您可以查看如何键入要删除的文件名(适用于文件和目录):
$ ls --quoting-style=shell-escape
yyy zzz 'zzz'$'\n''yyy'
$ rm 'zzz'$'\n''yyy'
$ ls
yyy zzz
方法2::第二种方法是使用find
使用inode编号(适用于文件和目录):
$ touch zzz yyy $'zzz\nyyy'
$ ls -li
total 2
3886009 -rw-r--r-- 1 user group 0 Jul 23 12:56 yyy
3886008 -rw-r--r-- 1 user group 0 Jul 23 12:56 zzz
662083 -rw-r--r-- 1 user group 0 Jul 23 12:56 zzz?yyy
$ find . -inum 662083 -delete
$ ls -li
total 1
3886009 -rw-r--r-- 1 user group 0 Jul 23 12:56 yyy
3886008 -rw-r--r-- 1 user group 0 Jul 23 12:56 zzz
答案 1 :(得分:0)
好像您的目录名中有一些特殊字符。您可以使用带有全局变量的循环:
for dir in *BizComponent; do
rm -r -- "$dir"
done
答案 2 :(得分:0)
由于外壳扩展,您需要转义特殊字符? + " ^
和space
。因此,要引用文件,您需要像这样删除/引用它们:
rm -rf \"\?\?\?\?\?+\ \"BizComponent/
rm -rf \"\?\+\ \"BizComponent
rm -rf \"\^J\^I\^I\^I\^I+\ \"BizComponent/BizComponent/
等等。
答案 3 :(得分:0)
您为什么不尝试rm -rf "?????+ BizComponent" | echo $?