如何正确组合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
相关产品推荐
相关产品推荐

