You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确组合xargs -I{}与sh -c处理空分隔文件名?

问题:处理空分隔文件名时xargs命令报错

我有一个存储空分隔文件名的文件list,其xxd输出如下:

00000000: 216d 706f 7373 6962 6c65 0022 4269 675f  !mpossible."Big_
00000010: 5369 7822 5f63 7269 636b 6574 5f64 6973  Six"_cricket_dis
00000020: 7075 7465 5f6f 665f 3139 3132 0022 446f  pute_of_1912."Do
00000030: 6322 5f53 6869 656c 7300 224a 7564 6765  c"_Shiels."Judge
00000040: 5f4a 7564 7922 5f53 6865 696e 646c 696e  _Judy"_Sheindlin
00000050: 0022 4a75 7374 5f79 6f75 725f 4176 6572  ."Just_your_Aver
00000060: 6167 655f 5365 636f 6e64 5f4f 6e5f 5468  age_Second_On_Th
00000070: 6973 5f50 6c61 6e65 7422 5f31 3939 372d  is_Planet"_1997-
00000080: 3139 3938 0022 4b69 6e67 225f 4a6f 655f  1998."King"_Joe_
00000090: 4f6c 6976 6572 0022 4d6f 7468 6572 225f  Oliver."Mother"_
000000a0: 456d 6d61 5f42 7563 6861 6e61 6e00 224e  Emma_Buchanan."N
000000b0: 6f6c 6c79 2200 2250 6570 7065 7222 5f50  olly"."Pepper"_P
000000c0: 6f74 7473 0022 536b 6970 7065 7222 2867  otts."Skipper"(g
000000d0: 616d 655f 6361 6e6e 6f6e 2900            ame_cannon).

执行命令:

xargs -0 -a list -I{} sh -c "html2text -ascii -o ~/text/{} ./{}"

出现错误:

Cannot open input file "./Doc_Shiels".
Cannot open input file "./Just_your_Average_Second_On_This_Planet_1997-1998".
sh: 1: Syntax error: "(" unexpected

请问应使用何种正确语法才能让该命令正常运行?

解决方案

命令报错的核心原因是文件名包含双引号、括号等特殊字符,直接在sh -c的字符串中替换会被shell解析为语法符号,导致文件名被截断或触发语法错误。以下是两种正确写法:

方法一:将文件名作为位置参数传递(推荐)

把{}作为sh -c的位置参数,通过$1引用并包裹双引号,避免shell解析特殊字符:

xargs -0 -a list -I{} sh -c 'html2text -ascii -o "$HOME/text/$1" "./$1"' sh {}
  • 用单引号包裹sh -c的命令字符串,防止当前shell提前解析变量和特殊字符。
  • $1是传递给子shell的文件名参数,双引号包裹确保包含空格、特殊字符的文件名被完整识别。
  • 末尾的sh是子shell的$0参数,可让错误信息更清晰(可选,但建议保留)。

方法二:直接执行命令(仅适用于无特殊字符解析问题的场景)

如果不需要通过子shell处理,可以尝试去掉sh -c,直接让xargs调用html2text:

xargs -0 -a list -I{} html2text -ascii -o ~/text/{} ./{}

但此方法对包含括号、引号的文件名仍会报错,因此更推荐方法一。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:06:19