同步而不扫描单个文件?

时间:2009-08-13 22:23:27

标签: linux file synchronization performance rsync

考虑两个目录:

/home/user/music/flac
/media/MUSIC/flac

我希望第二个目录(目标; USB驱动器)包含与第一个目录(master)相同的文件和结构。有3600多个文件(总共59G)。每个文件都使用unison进行扫描,速度非常慢。我宁愿根据文件名,大小和修改时间进行比较。

我认为rsync可能会更好,但手册页中的示例相当神秘,而Google搜索并未透露任何简单,富有洞察力的示例。我宁愿不小心擦除主文件中的文件。 ; - )

主列表将随时间而变化:重新组织目录,添加新文件和更新现有文件(例如,重新标记)。通常这些变化很小;花费数小时完成同步对我来说是次优的。

将目标目录与主目录同步的确切命令是什么?

该命令应复制新文件,重新组织移动的文件(或删除然后复制),并复制更改的文件(基于日期)。目标文件的时间戳应设置为主时间戳。

2 个答案:

答案 0 :(得分:6)

您可以这样使用rsync:

rsync --delete -r -u /home/user/music/flac/* /media/MUSIC/flac

它将删除/ media / MUSIC / flac中的文件(从不在master上),并根据文件日期进行更新。

还有更多选择,但我认为这种方式对您来说已经足够了。 : - )

(我只做了简单的测试!请测试更好!)

答案 1 :(得分:0)

您可以使用简单的cp复制新版&更改的文件(只要您的文件系统有工作时间戳):

cp -dpRuv /home/user/music/flac /media/MUSIC/

要从目标中删除源中不存在的文件,您需要使用find。像这样创建一个脚本/home/user/bin/remover.sh

#!/bin/bash

CANONNAME="$PWD/$(basename $1)"
RELPATH=$(echo "$CANONNAME" | sed -e "s@/media/MUSIC/flac/@@")
SOURCENAME="/home/user/music/flac/$RELPATH"

if [ ! -f "$SOURCENAME" ]; then
        echo "Removing $CANONNAME"
        rm "$CANONNAME"
fi

使其可执行,然后从find

运行它
find /media/MUSIC/flac -type f -execdir /home/user/bin/remover.sh "{}" \;

唯一不做的就是从目标中删除已在源中删除的目录 - 如果你也想要这样做,你必须使用类似的查找/脚本组合进行第三次传递。