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

使用 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/

答案1

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

find . -type d -print0 | xargs -0 rm -rf

以下是关于为什么会出现问题以及修复方法的很好的解释Linux 命令行作者:William E. Shotts Jr

处理有趣的文件名

类 Unix 系统允许在文件名中嵌入空格(甚至换行符!)。这给那些xargs为其他程序构建参数列表的程序带来了问题。嵌入的空格将被视为分隔符,并且生成的命令会将每个空格分隔的单词解释为单独的参数。为了解决这个问题,find 和 xarg 允许可选地使用空字符作为参数分隔符。空字符在 ASCII 中定义为数字零所表示的字符(例如,与空格字符相反,空格字符在 ASCII 中定义为数字 32 所表示的字符)。find 命令提供了操作 -print0,它生成空分隔的输出,而 xargs 命令具有 --null 选项,它接受空分隔的输入。以下是一个例子:

find ~ -iname '*.jpg' -print0 | xargs --null ls -l

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

-0是该选项的简短版本--null

答案2

你不需要xargsfind它本身就可以通过处理来健壮地完成:

  • 任何可能的文件名

  • 无需触发ARG_MAX

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

find . -type d -delete

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

find . -type d -exec rm -r {} +

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

find . -type d | xargs -d $'\n' rm -r

-0最好的方法是,将文件 NUL 分离,然后使用以下选项处理xargs

find . -type d -name 'foo bar*' -print0 | xargs -0 rm -r

对于所有rm -r使用的,如果需要,请添加-f即做。rm -rf

答案3

要专门删除名称中包含空格的所有子目录,最简单的命令是:

find . -type d -name "* *" -exec rm -rf {} +

这与 heemayl 已经建议的方法相同,唯一的区别在于-name过滤。

相关内容