SSH和焦油增量传输(如rsync)

在没有rsync客户端的主机环境中,我想执行类似于rsync所做的操作:只发送已更改的文件。

我会在当前目录上执行这一行。 这将更新archive.tar.gz与更改的文件,然后scp文件到远程站点,并最终解压它离开同步的目录。 我有这种使用多个pipe道的愿景,但我想我需要一个档案来实际使用增量function。

在使用增量时,我会在tar语法中迷失方向。

bozosync.sh

嗯,如果你只想移动更改的文件,为什么tar命令更新档案? 如果只发送了更改的文件,那么tar文件不仅仅是由它们组成,那么每次都必须从头开始重新创build?

如果我正确理解这个,你想要这样的东西,我把它bozosync.sh

 TarFile=fun.tgz TheScript=$0 result= ls -1 . | ( while read f; do if [ -f "$f" -a $f -nt $TheScript ]; then result="$result $f" fi done tar cvfz $TarFile $result touch $TheScript ) 

这将每个纯文件放在tar归档文件的当前目录中,对于每个比脚本本身更新的文件,然后在脚本上运行touch(1)以更新其mod时间。 这确实有一个竞争条件,因为在testing和触摸之间修改的文件将在下次被忽略。 如果这是一个问题,你可以通过在循环之前复制脚本,然后在最后把它移回自己来解决。 (然后你还有一场比赛,但是失败比较轻松,可能只包括一个没有真正改变的文件。)

这是DigitalRoss脚本的修改版本:

 #!/bin/bash TarFile=fun.tgz TheScript=$0 saveIFS="$IFS" IFS=$'\n' files=($( find -maxdepth 1 -type f -newer $TheScript -print )) tmpfile=$(mktemp) IFS="$saveIFS" tar cvfz $TarFile "${files[@]}" && touch -r $tmpfile $TheScript rm $tmpfile 

这通过将find结果保存在数组中并立即创build临时文件来减less竞争条件的机会。 但是,这当然不能保证。 而且,这个脚本避免了使用ls 。 另一个好处是,如果tar成功,它只会更新脚本的时间戳。 它也将处理空格的文件名。

testing之后,我做了一些改动,但是非常感谢。

 #!/bin/bash TarFile=transfer-me.tar.gz TheScript=$0 saveIFS="$IFS" IFS=$'\n' files=($(find . -maxdepth 1 -newer $TheScript -print)) unset files[0]; #remove "." tmpfile=$(mktemp temp.XXXXXX) IFS="$saveIFS" elements=${#files[@]} if [ "$elements" -gt "0" ]; then tar cvfz $TarFile --exclude ".svn" --exclude ".swp" --exclude "Icon?" --exclude ".DS_Store" --exclude "$TarFile" "${files[@]}" && touch -r $tmpfile $TheScript fi rm $tmpfile;