当我在我的目录中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
之后询问有关转义/替换引号的问题。对不起,如果我的问题令人困惑
答案 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。这可以用来摆脱许多名字中有滑稽字符的文件。