为什么 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
使用infind
和xargs -0
in修复它,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
你不需要xargs
,find
它本身就可以通过处理来健壮地完成:
任何可能的文件名
无需触发
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
过滤。