如何结合xargs使用hdfs dfs cp绕过Linux参数列表长度限制
错误根源
你之前的命令报错核心原因是误用了xargs的-I参数,该参数会将所有输入内容(含换行符、空格)作为单个整体替换到占位符位置,导致传入hdfs dfs -cp的源路径实际携带换行符,系统无法识别对应路径。你手动复制打印出的命令时,换行符被自动转换为空格,所以手动执行可以正常运行。而-0参数要求输入以null字符作为分隔符,你没有对输入做对应处理,也会导致所有路径被识别为单个参数。
解决方案
情况1:文件名不含空格、换行等特殊字符
直接使用xargs自动分批传参,配合sh包装保证目标路径在最后,适配你使用的2.6.0版本Hadoop(该版本不支持hdfs dfs -cp的-t参数,无法把目标路径放在前面):
echo "/user/florian_castelain/test/yolo /user/florian_castelain/ignore_dtl" | xargs sh -c 'hdfs dfs -cp -p "$@" /user/florian_castelain/test/xargs/' _
说明:末尾的_是占位符,用于填充sh的$0参数,避免第一个源路径被吞掉。xargs会自动把输入的路径拆分成不超过系统参数长度限制的批次,每批次执行一次hdfs dfs -cp,既绕过参数长度限制,又比单文件拷贝效率高很多。
情况2:文件名含空格、换行等特殊字符
用null字符作为路径分隔符,配合xargs的-0参数识别:
# 示例:用find获取需要拷贝的文件,输出时用null分隔 find /your/source/path -type f -print0 | xargs -0 sh -c 'hdfs dfs -cp -p "$@" /user/florian_castelain/test/xargs/' _
内容的提问来源于stack exchange,提问作者Itération 122442
相关产品推荐
相关产品推荐

