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

Anu*_*nuj 13 shell xargs quoting rm

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

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

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

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

Ste*_*itt 30

您可以在rm命令上使用标准通配符:

rm -- *\ *
Run Code Online (Sandbox Code Playgroud)

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

如果要在删除之前确认每个文件,请添加-i选项:

rm -i -- *\ *
Run Code Online (Sandbox Code Playgroud)

  • 您肯定希望首先通过“回声”运行它,以防止打字错误。在前面添加`echo`,它将打印出它要删除的所有文件。 (4认同)

sol*_*iCe 18

我会避免解析ls输出

为什么不 :

find . -type f -name '* *' -delete
Run Code Online (Sandbox Code Playgroud)

没问题rm:-)。

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

  • (1) 你可以使用 `-name '* *'` 代替正则表达式;(2) 你可以使用`-print0 | xargs -0 rm -i` 来解决 @StephenKitt 的问题。 (4认同)
  • 不需要“xargs”。只需使用 `-exec rm -i '{}' +` (2认同)

elb*_*rna 7

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

解决方案一

rm strange\ file
Run Code Online (Sandbox Code Playgroud)

解决方案二

rm "strange file"
Run Code Online (Sandbox Code Playgroud)

解决方案三

ls -i "strange file"
Run Code Online (Sandbox Code Playgroud)

然后你看到 inode

find . -inum "numberoofinode" -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

在非常奇怪的文件名的情况下,例如

!-filename or --filename
Run Code Online (Sandbox Code Playgroud)

用

rm ./'!-filename'
Run Code Online (Sandbox Code Playgroud)


小智 5

从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