如何删除文件名中带引号的文件

时间:2015-02-13 17:03:24

标签: bash shell

当我在我的目录中ls时,得到一堆这些:

data.log".2015-01-22"
data.log".2015-01-23"

然而,当我这样做时:

rm: cannot remove `data.log.2015-01-22': No such file or directory

如果我能以某种方式做某事ls | escape quotes | xargs rm

所以是的,如何删除包含"的文件?

更新

虽然大多数答案都有效。我实际上是想这样做:

ls | rm

所以有些文件失败了。如何在ls之后逃避管道中的报价。大多数答案实际上解决了有效的文件的手动操作。但我在ls之后询问有关转义/替换引号的问题。对不起,如果我的问题令人困惑

6 个答案:

答案 0 :(得分:3)

使用单引号引用双引号或反斜杠:

rm data.log'"'*
rm data.log\"*

否则,双引号将被shell解释并从字符串中删除。

回答更新的问题:

不要处理ls的输出。文件名可以包含空格,换行符等。

答案 1 :(得分:1)

你可以这样做。

find . -type f -name '*"*' -exec rm {} +

答案 2 :(得分:1)

使用单引号转义引号

$ touch '"  and spaces also "'
$ ls
"  and spaces also "
$ rm '"  and spaces also "'
$ ls
$

在你的情况下:

$ rm 'data.log".2015-01-22"' 'data.log".2015-01-23"'

答案 3 :(得分:0)

ls | rm

不起作用,因为rm从命令行参数中获取要删除的文件,而不是标准输入。您可以使用xargs将标准输入转换为参数。

ls | xargs -d '\n' rm

但是要删除所需的文件,请引用包含单引号的名称部分:

rm 'data.log"'.*

答案 4 :(得分:0)

1st - 建议 - 修改创建文件名的工具,其中包含引号...... :)

使用您选择的工具尝试一点野性魔法 - 即我会使用tr

ls | escape quotes | xargs rm  ## becomes something like:  
ls | tr "[\",']" '?' | xargs rm ## does not work on my system but this does:
rm -v $(ls *sing* *doub* | tr "[\",']" '?')

输出是:

removed `"""double"""'
removed `\'\'\'single\'\'\''

现在:

$ touch "'''single'''" '"""double"""'
$ ls -l *sing* *doub*
-rw-rw-r-- 1 dale dale 0 Feb 15 09:48 """double"""
-rw-rw-r-- 1 dale dale 0 Feb 15 09:48 '''single'''

如果你的模式是一致的,那么另一种方式可能就是简化:

$ rm -v *sing* *doub*
removed `\'\'\'single\'\'\''
removed `"""double"""'

对于你的例子:

rm -v data.*${YEAR}-${MONTH}-${DAY}*  ## data.log".2015-01-22"  OR
rm -v data.*${YEAR}-${MONTH}-${DAY}?  ## data.log".2015-01-22"

答案 5 :(得分:0)

如果您只是偶尔需要以交互方式执行此操作,请使用

rm -i -- *

并根据需要回答y或n。这可以用来摆脱许多名字中有滑稽字符的文件。