如何结合xargs与sed实现文件路径重命名?
问题原因与解决方法
问题根因
你写的命令里,反引号包裹的sed命令会被外层shell提前解析执行,此时xargs的{}还没被替换成实际的路径字符串,sed处理的是空内容或者{}本身,自然不会产生替换效果。
解决方案
方案1:用bash子shell延迟执行sed
通过bash -c启动子shell,让sed在拿到实际路径参数后再执行:
echo "./src/main/java/com/abc" | xargs -I {} bash -c 'new=$(sed "s/abc/def/" <<< "$1"); echo "mv $1 $new"' _ {}
方案2:用bash内置字符串替换(更高效)
直接利用bash的内置字符串替换功能,无需调用外部sed命令:
echo "./src/main/java/com/abc" | xargs -I {} bash -c 'new=${1/abc/def}; echo "mv $1 $new"' _ {}
验证结果
执行上述任意命令,都会输出你预期的结果:
mv ./src/main/java/com/abc ./src/main/java/com/def
内容的提问来源于stack exchange,提问作者leechor
相关产品推荐
相关产品推荐

