无需重命名或循环,将含空格文件名的Unix文件复制到HDFS
可行解决方案
针对带空格文件名的批量HDFS上传问题,以下两种方法可可靠解决,无需重命名文件或低效的单文件循环:
方案1:处理当前目录下所有文件(不含子目录)
用printf生成空字符分隔的文件名列表,配合xargs -0传递给hdfs dfs -put,完美适配含空格的文件名:
printf "%s\0" * | xargs -0 hdfs dfs -put -f /hdfs_folder/
方案2:递归处理当前目录及所有子目录文件
如果需要包含子目录中的文件,用find的-print0配合xargs -0实现递归批量上传:
find . -type f -print0 | xargs -0 hdfs dfs -put -f /hdfs_folder/
你之前的命令无效原因
- 第一个命令中给
{}加引号是多余操作:-print0和xargs -0已经确保文件名被正确解析,引号会被当成文件名的一部分,导致HDFS找不到对应文件。 - 第二个
find -exec命令效率极低(数万个文件会触发数万次put调用),且同样可能因多余引号导致失败。 - 第三个命令的管道处理过于复杂,中间的
awk操作易引入路径错误,完全没必要。
注:
-f参数用于覆盖HDFS目标目录中已存在的同名文件,若不需要覆盖可移除该参数。
内容的提问来源于stack exchange,提问作者alejomarchan
相关产品推荐
相关产品推荐

