Answers:
您可以在以下rm
命令上使用标准的globbing :
rm -- *\ *
这将删除名称中包含空格的所有文件。该空间已转义,因此外壳程序不会将其解释为分隔符。添加--
将避免文件名以破折号开头的问题(它们不会被解释为参数rm
)。
如果要在删除每个文件之前对其进行确认,请添加以下-i
选项:
rm -i -- *\ *
find
功能强大,但有时您不需要用机枪杀死鸡肉。UNIX管理员通常不会求助于find
(例如)“删除所有以字母A开头的文件”……一个简单地rm A*
。同样,要删除包含空格的文件,rm也可以执行此操作。换句话说,不要被愚弄,因为空间是不可见的,并且由外壳程序专门处理。就像史蒂芬·基特(Stephen Kitt)所做的那样,只需将其转义即可,您可以将其视为其他任何角色。
我会避免解析ls
输出
为什么不 :
find . -type f -name '* *' -delete
rm
:-) 没问题。
尽管这是递归的,并且会删除注释中提到的当前目录和嵌套目录中所有带空格的文件。
-name '* *'
regex代替;(2)您可以-print0 | xargs -0 rm -i
用来解决@StephenKitt的问题。
xargs
。只需使用-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
。
从 man xargs
xargs从标准输入中读取由空格(可以用双引号或单引号或反斜杠保护)或换行符分隔的项目,并执行一次(多次)命令(默认为/ bin / echo),并在其后加上任何初始参数按从标准输入中读取的项目。标准输入上的空白行将被忽略。
我们可以(主要)通过将xargs分隔符更改为换行符来修复您的初始命令:
ls | egrep '. ' | xargs -d '\n' rm
(不要这样做...继续阅读)
但是,如果文件名包含换行符怎么办?
touch "filename with blanks
and newline"
因为Unix文件名可以包含空格和换行符,所以这种默认行为经常会出现问题。xargs错误地处理了包含空格和/或换行符的文件名。在这些情况下,最好使用-0选项,以防止出现此类问题。
ls
确实是人类直接消费的工具,相反,我们需要使用find
可以使用空字符(-print0
)分隔文件名的命令。我们还需要告诉grep使用空字符来分隔输入(-z
)和输出(-Z
)。最后,我们告诉xargs也使用空字符(-0
)
find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
为此,您将需要-Z
grep -0
选项和xargs选项。但是我不会那样做(这不是完成ls
任务的正确工具,让计算机读取其输出存在许多问题)。
查看其他答案以获得更好的方法。
也
ls | …
等于ls -d *
和echo * | …
所有这些都有问题。因此,不要这样使用ls
,而要使用另一个答案的解决方案。
ls *
当管道输出以换行符分隔的文件名时。echo
(至少某些echo
实现)扩展反斜杠序列。grep -Z
用于编写使用时使用NUL分隔的文件名-l
,在这里无济于事。如果您的意思是-z
,那将无济于事,因为大多数ls
实现都缺少输出以NUL分隔的文件名的选项。printf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
虽然可以做类似的事情。
echo
首先尝试运行此程序,以防止输入错误。echo
在最前面添加,它将打印出将要删除的所有文件。