删除名称中带有空格的文件


10

我正在尝试删除名称中带有空格的所有文件。我正在使用以下命令。但这给我一个错误

命令: ls | egrep '. ' | xargs rm

在这里,如果我仅使用ls | egrep '. '命令,它将为我提供所有文件名,文件名中带有空格。但是,当我尝试将输出传递给rm时,所有空格(前导或尾随)都会被删除。因此我的命令未正确执行。

关于如何删除名称中至少有一个空格的文件的任何指针?

Answers:


29

您可以在以下rm命令上使用标准的globbing :

rm -- *\ *

这将删除名称中包含空格的所有文件。该空间已转义,因此外壳程序不会将其解释为分隔符。添加--将避免文件名以破折号开头的问题(它们不会被解释为参数rm)。

如果要在删除每个文件之前对其进行确认,请添加以下-i选项:

rm -i -- *\ *

4
您肯定会echo首先尝试运行此程序,以防止输入错误。echo在最前面添加,它将打印出将要删除的所有文件。
2015年

1
阿努伊(Anuj)投票最多的原因是因为尽管find功能强大,但有时您不需要用机枪杀死鸡肉。UNIX管理员通常不会求助于find(例如)“删除所有以字母A开头的文件”……一个简单地rm A*。同样,要删除包含空格的文件,rm也可以执行此操作。换句话说,不要被愚弄,因为空间是不可见的,并且由外壳程序专门处理。就像史蒂芬·基特(Stephen Kitt)所做的那样,只需将其转义即可,您可以将其视为其他任何角色。
Mike S

14

我会避免解析ls输出

为什么不 :

find . -type f -name '* *' -delete

rm:-) 没问题。

尽管这是递归的,并且会删除注释中提到的当前目录和嵌套目录中所有带空格的文件。


4
(1)您可以使用-name '* *'regex代替;(2)您可以-print0 | xargs -0 rm -i用来解决@StephenKitt的问题。
凯文

1
不需要xargs。只需使用-exec rm -i '{}' +
R .. GitHub停止帮助ICE 2015年

1
@Mhmd它比8位游戏机更具陷阱。mywiki.wooledge.org/ParsingLs
Daenyth

1
如果要避免使用子目录,请使用find . -maxdepth 1 -name '* *' -delete
Mikkel 2015年

1
@BenjaminW。固定的?
solsTiCe

6

看看这个假设名称“奇怪的文件”

解决方案一

rm strange\ file

解决方案二

rm "strange file"

解决方案三

ls -i "strange file"

你会看到索引节点

find . -inum "numberoofinode" -exec rm {} \;

如果文件名很奇怪

!-filename or --filename

使用

rm ./'!-filename'

4

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



-1

为此,您将需要-Zgrep -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虽然可以做类似的事情。
斯特凡Chazelas

1
@Kusalananda我想我已经解决了。
ctrl-alt-delor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.