使用 xargs 删除名称中带有空格的文件夹

Mon*_*lal 12 command-line find xargs

为什么 xargs 不能删除名称中带有空格的目录,以及如何解决这个问题?

76 find . -type d |xargs  rm -rf
 77 rm -rf fire\ hydrant/
 78 rm -rf wine\ glass/
 79 rm -rf tennis\ racket/
 80 rm -rf traffic\ light/
 81 rm -rf parking\ meter/
 82 rm -rf teddy\ bear/
 83 rm -rf sports\ ball/
 84 rm -rf cell\ phone/
 85 rm -rf stop\ sign/
 86 rm -rf dining\ table/
 87 rm -rf potted\ plant/
Run Code Online (Sandbox Code Playgroud)

Zan*_*nna 24

使用-print0infindxargs -0in修复它xargs以告诉两个命令使用 NULL 字符作为分隔符而不是空格:

find . -type d -print0 | xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

以下是William E. Shotts Jr 的The Linux Command Line 中关于它为什么会中断以及此修复程序如何工作的一个很好的解释。

处理有趣的文件名

类 Unix 系统允许在文件名中嵌入空格(甚至换行符!)。这会导致诸如xargs为其他程序构造参数列表之类的程序出现问题。嵌入的空格将被视为分隔符,生成的命令会将每个空格分隔的单词解释为单独的参数。为了克服这个问题, find 和 xarg 允许可选地使用空字符作为参数分隔符。空字符在 ASCII 中定义为由数字 0 表示的字符(例如,与空格字符相反,后者在 ASCII 中定义为由数字 32 表示的字符)。find 命令提供操作 -print0,它产生空分隔的输出,而 xargs 命令具有 --null 选项,它接受空分隔的输入。下面是一个例子:

find ~ -iname '*.jpg' -print0 | xargs --null ls -l
Run Code Online (Sandbox Code Playgroud)

使用这种技术,我们可以确保正确处理所有文件,即使是名称中包含嵌入空格的文件。

-0--null选项的简短版本)


hee*_*ayl 17

你不需要xargsfind它本身可以通过处理稳健地做到这一点:

  • 任何可能的文件名

  • 不触发 ARG_MAX

如果目录为空,请使用-delete操作:

find . -type d -delete
Run Code Online (Sandbox Code Playgroud)

如果不为空,请rm -r-exec操作中使用:

find . -type d -exec rm -r {} +
Run Code Online (Sandbox Code Playgroud)

如果您坚持使用xargs, 对于名称中没有换行符的任何目录名称,您可以使用换行符作为传入参数的分隔符:

find . -type d | xargs -d $'\n' rm -r
Run Code Online (Sandbox Code Playgroud)

最好的方法是将文件 NUL 分开并使用以下-0选项处理它xargs

find . -type d -name 'foo bar*' -print0 | xargs -0 rm -r
Run Code Online (Sandbox Code Playgroud)

对于所有rm -r使用过的,如果需要添加-fie do rm -rf

  • @paj28 不,你指的是 `-exec ... {} \;`,这里我使用了 `-exec ... {} +`(注意 `+` 而不是 `\;`),它需要尽可能多的文件,因此不会触发`ARG_MAX`。 (3认同)
  • @AndreaLazzarotto `xargs` 也处理 `ARG_MAX`。只是因为你已经在使用 `find`,所以没有必要产生一个额外的进程,当然当 `find` 可以单独完成需要时,一个匿名管道。 (2认同)