2009-08-13 64 views
6

考虑两个目录:同步而不扫描单个文件?

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

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

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

主列表将随时间变化:目录重组,新文件添加以及现有文件更新(例如重新标记)。通常这些变化很小;花费数小时才能完成同步,使我感到次优。

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

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

回答

6

您可以使用rsync这样:

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

它会删除/媒体/音乐/ FLAC(从来没有在主站)文件,和更新基于文件的日期。

有更多的选择,但我认为这种方式已经足够。 :-)

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

+1

'rsync'旨在通过网络加速这些类型的同步,因此您不必发送全部59G。它不会在本地机器上加速,因为发件人和收件人都必须读取各自树中的所有内容。 – caf 2009-08-14 02:46:40

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 "[email protected]/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 "{}" \; 

这不会做的唯一事情是从已经在被删除的目的地删除目录来源 - 如果你也想这样做,你必须进行第三次传球,并且有类似的发现/脚本组合。

+0

在bash中这对我不起作用 - 我在cash的bash手册页中看到p(保留文件属性),R(递归)和v(详细),但不是d和u。 – sage 2011-01-16 22:42:18