操作系统 - Ubuntu Linux,实用程序首选 - rsync
是否可以将所有文件从第一个文件夹(1/文件夹)复制到第三个文件夹(3/文件夹),这些文件比第二个文件夹(2/文件夹)中更新或不存在,并且目录结构相同?
我不希望第三个文件夹中有任何硬链接。
我尝试过以下方法,但无法让它工作
rsync -av --link-dest /2/folder root@s1:/1/folder /3/.
我现在正在做的是复制整个文件夹,然后通过将第三个文件夹与第二个文件夹进行比较来删除其中的重复项
rsync -av root@s1:/1/folder /3/.
fdupes -r -d -N -o name //2/folder /3/folder
find /3/folder -type d -empty -delete
显然这需要双倍的空间、双倍的带宽和双倍的时间。
直接的方法将受到赞赏。
我尝试了一些其他脚本和工具(如rdiff-backup等),但无法使其工作。
谢谢。
编辑:
我还想知道是否可以使用 rsync 将 1/ 和 2/ 之间的文件列表复制到文本文件中,然后用 3/ 替换其中的 2/ 并使用它来手动复制?
答案1
对我来说,这个有点难懂,说实话,听起来像是一个 XY 问题。
但不管怎么说:
实现此目的的一种方法是使用find
获取相对于 ./2/ 且比时间 X 更新的所有文件的列表,并将其通过管道传输到或cp
“rsync”。但是,您会遇到“缺少目标目录”问题,因为 cp 只会复制基础文件。为了解决这个问题,您可以在复制文件之前使用以下命令创建所有父目录mkdir -p
把它们放在一起看起来就像这样:
function cpbyref() {
cd ./2
ref=$(find -type f -cmin -TIMESINCELASTRUNINMINUTES )
cd -
echo $ref | xargs -i sh -c 'mkdir -p ./1/"${1%/*}/"; cp ./1/"$1" ./3/"$1"' '--' '{}'
}
这是我凭空想出来的,没有测试过,你可能需要摸索一下其中的一些内容,但它应该能让你大致了解如何去做
答案2
此命令将实现您的要求,假设指定的目录1
、2
、3
位于当前目录 ( $PWD
)。这对于源和目标来说不是必需的,但比较目录路径是相对于目标的,因此我们必须将其设为绝对路径:
rsync --dry-run -av --update --compare-dest="$PWD"/2/folder/ "$PWD"/1/folder/ "$PWD"/3/folder/
工作场景
mkdir -p {1,2,3}/folder # 1=src, 2=cmp, 3=dst
date >2/folder/date
ps -f >1/folder/ps-f
who >1/folder/who
cp -p 1/folder/who 2/folder/who
cp -p 1/folder/ps-f 3/folder/ps-f
sleep 1
date >1/folder/date
tree {1,2,3}/folder
1/folder
├── date
├── ps-f
└── who
2/folder
├── date
└── who
3/folder
└── ps-f
我们现在有一组示例文件对,其中date
不同,但who
和ps-f
相同。
rsync --dry-run -av --update --compare-dest="$PWD"/2/folder/ 1/folder/ 3/folder/
sending incremental file list
./
date
sent 123 bytes received 23 bytes 292.00 bytes/sec
total size is 181 speedup is 1.24 (DRY RUN)
您可以从输出中看到,rsync
只会传输更改的单个文件date
。其他所有内容均保持不变,包括因为在比较目录中的who
源匹配中who
不是传送至目的地。
与以往一样,删除--dry-run
以允许rsync
执行其计划而不仅仅是显示它。