【发布时间】:2022-06-10 21:47:46
【问题描述】:
我不擅长 bash,因此提出问题:
我想找到未锁定的文件并将其传递给 robocopy 命令
find . -type f -exec sh -c 'if ! lsof `readlink -f {}` > /dev/null; then echo `basename {}`; fi' \; | tr '\n' '\0' | rsync -avz --from0 --files-from=- ./ /data/uploads/ --dry-run
问题是上述命令只有文件名(u14216.jpg)而不是相对文件名(./comps/gps/pictures/)
完整路径为/www-data/pictures/u14216.jpg
我把echo basename {} 改成了 echo realpath {};
然后使用此代码获取正确的路径:/www-data/pictures/u14216.jpg
find . -type f -exec sh -c 'if ! lsof `readlink -f {}` > /dev/null; then `echo `realpath {}`; fi' \; | tr '\n' '\0'`
但是当管道输出到 rsync 得到这个错误:
find . -type f -exec sh -c 'if ! lsof `readlink -f {}` > /dev/null; then echo `realpath {}`; fi' \; | tr '\n' '\0' | rsync -avz --from0 --files-from=- ./ /data/map/uploads/ --dry-run
building file list ...
rsync: link_stat "/www-data/www-data/pictures/u14216.jpg" failed: No such file or directory (2)
我在 /www-data folder 中,并且 rsync 以某种方式将另一个 /www-data 附加到完整路径
如何调整上述命令以获得完整路径,显然需要更改echo basename {}
【问题讨论】: