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
使用-print0infind和xargs -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 选项,它接受空分隔的输入。下面是一个例子:Run Code Online (Sandbox Code Playgroud)find ~ -iname '*.jpg' -print0 | xargs --null ls -l使用这种技术,我们可以确保正确处理所有文件,即使是名称中包含嵌入空格的文件。
(-0是--null选项的简短版本)
hee*_*ayl 17
你不需要xargs,find它本身可以通过处理稳健地做到这一点:
任何可能的文件名
不触发 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。
| 归档时间: |
|
| 查看次数: |
2150 次 |
| 最近记录: |