如何将find输出的绝对路径转换为rsync支持的相对路径
修改方法
你只需要在调用realpath时添加--relative-to参数,指定路径基准为rsync的同步源目录即可,修改后的完整命令如下:
cd /www-data find ./ -type f -exec sh -c 'if ! lsof "$(readlink -f "$1")" > /dev/null; then realpath --relative-to=./ "$1"; fi' sh {} \; | tr '\n' '\0' | rsync -avz --from0 --files-from=- ./ /data/map/uploads/ --dry-run
关键修改说明
- 为
realpath增加--relative-to=./参数:由于你已经提前执行cd /www-data切换到了rsync的源根目录,该参数会让realpath直接输出所有匹配文件相对于/www-data的相对路径,完全匹配rsync--files-from参数的路径要求。 - 优化了内联shell的传参写法:将原有的反引号嵌套替换为
$()写法,同时给所有变量添加双引号包裹、补全sh -c的$0占位传参,避免文件名包含空格、特殊字符时出现执行错误,兼容性更强。
可选调整
如果你不想提前执行cd切换目录,可以直接将基准路径写为绝对路径,命令可简化为:
find /www-data/ -type f -exec sh -c 'if ! lsof "$(readlink -f "$1")" > /dev/null; then realpath --relative-to=/www-data "$1"; fi' sh {} \; | tr '\n' '\0' | rsync -avz --from0 --files-from=- /www-data/ /data/map/uploads/ --dry-run
执行效果和上面的命令完全一致。
内容的提问来源于stack exchange,提问作者overflowed
相关产品推荐
相关产品推荐

