![删除所有以括号开头的文件](https://linux22.com/image/3426/%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E4%BB%A5%E6%8B%AC%E5%8F%B7%E5%BC%80%E5%A4%B4%E7%9A%84%E6%96%87%E4%BB%B6.png)
我的目录中有许多以括号开头的文件。它们是由 Dropbox 由于冲突而生成的。任何转义组合似乎都没有帮助:
rm -rf "(*"
rm -rf "\(*"
rm -rf \(*
正如弗罗斯特舒茨提到的,它们似乎不是 ASCII 字符。我怎样才能知道是否是这种情况,以及解决方法是什么?
答案1
shell 使用某些规则解释命令行,您必须在此处考虑这些规则:
您可以使用 \ 转义 shell 元字符,使其表现得像普通字符一样。
您可以使用单引号或双引号,并且在这些大多数(带双引号)或所有(带单引号)shell 元字符中失去其特殊含义。
引号不必位于单词边界,因此
rm th"is fil"e
与 相同rm "this file"
。字符 []?* 可用于文件名扩展。为此目的,不得引用或转义它们。
因此,适合您的情况的可能解决方案是rm -rf '('*
和。我不知道为什么最后一个对你的情况不起作用。也许括号前面有一些空格?rm -rf "("*
rm -rf \(*
通过以下行,您应该能够查看文件名中是否有任何有趣的字符:
for i in *; do od -c <<< "$i"; done
答案2
如果你放在*
里面"
,否则'
它不会扩展(它只是一个字面意思*
)。
但你可以把*
外面"
:
rm "("*
rm \(*
但是,这与您已经发布的内容相同。因此,如果这不起作用,要么您的文件(
毕竟不是以 ASCII 字符开头(有些 Unicode 字符看起来非常相似),要么您在错误的位置尝试此操作。
答案3
您可以尝试以下两件事:
1)rm -f \\(*
-r
(除非你想递归地删除目录,否则 你不需要。既然你说“文件”,我就把它保留下来。rm -rf
它是一个危险的工具,如果不需要,就不应该使用。)
2) rm -i *
此方法需要一些手动干预,但由于非字母数字字符往往会先排序,因此您要删除的内容往往会先出现,您可以^C
在获得它们后发出 a 。
请注意,当尝试使用奇怪的通配符时,请尝试使用echo
in 代替rm
first。 尤其如果使用rm -rf
.这样您就可以在删除内容之前看到 shell 认为它扩展为什么(如果有的话)。特别是因为有时这种类型的文件是由某人创建的,希望您做一些愚蠢的事情并吹走比您想要的更多的文件。
答案4
在我只需清理此类文件一次的情况下,我只需将它们列出到一个文件中:
$ ls -1 > delete-list
接下来,手动编辑delete-list
,使其仅包含我要删除的文件的名称。最后:
$ xargs --delim=\\n rm < delete-list
如果名称在空格方面表现良好,那么您可以删除偏执--delim
选项。