使用xargs时如何通过basename去除文件扩展名生成新后缀文件
解决xargs替换文件扩展名的问题
你的命令失效的核心原因:$(basename % .las) 会被当前Shell提前解析,而非等xargs将%替换为实际文件名后再执行。此时basename处理的是字符串%,输出仍为%,最终echo的内容变成%.ply,xargs替换%为文件名后,就出现了ID1.las.ply这类不符合预期的结果。
给你两种可行的解决方案:
方案1:用bash -c包裹命令,延迟解析basename
ls *.las | xargs -I % -n1 -P 10 bash -c 'echo "$(basename "$1" .las).ply"' _ %
- 单引号会阻止Shell提前解析内部命令,让xargs替换
%后再交给bash执行 _是占位符,用来填充bash -c命令的$0位置,$1代表传入的实际文件名
方案2:用Shell参数扩展直接替换后缀(更高效)
ls *.las | xargs -I % -n1 -P 10 bash -c 'echo "${1%.las}.ply"' _ %
${1%.las}表示从文件名($1)末尾移除.las后缀- 无需调用外部
basename命令,执行效率更高
执行上述任意命令后,都会得到你期望的输出:
ID1.ply ID2.ply ID3.ply
内容的提问来源于stack exchange,提问作者kungphil
相关产品推荐
相关产品推荐

