当我做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 | escape quotes | xargs rm
所以呀,我怎么删除包含这些文件"
?
更新
虽然大多数的答案的工作。 实际上,我是想这样做:
ls | rm
因此,它是失败的一些文件。 我怎样才能逃脱后在管报价ls
。 大部分的答案居然解决了文件,它的工作原理的手动操作。 但我问的是转义/后更换报价ls
。 很抱歉,如果我的问题是混淆
使用单引号引用的双引号或反斜线:
rm data.log'"'*
rm data.log\"*
否则,双引号被shell解释,并从字符串中删除。
回答到更新的问题:
不处理的输出ls
。 文件名可以包含空格,换行等。
你可以做这样的。
find . -type f -name '*"*' -exec rm {} +
逃生用单引号报价
$ touch '" and spaces also "'
$ ls
" and spaces also "
$ rm '" and spaces also "'
$ ls
$
你的情况:
$ rm 'data.log".2015-01-22"' 'data.log".2015-01-23"'
ls | rm
不起作用,因为rm
获取文件的命令行参数删除,而不是从标准输入。 您可以使用xargs的标准输入转换为参数。
ls | xargs -d '\n' rm
但只是删除你想要的文件,引用包含单引号名称的一部分:
rm 'data.log"'.*
1 - 建议 - 修改工具与他们的报价创建文件名... :)
试着一点点野生焦炭魔法-用您所选择的工具,即我将使用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"
如果你只需要在一段时间曾经这样做交互,使用
rm -i -- *
并回答y或n为适当。 这可以用来摆脱在他们的名字奇怪的字符许多文件。