选项 1——纯 rsync

选项 1——纯 rsync

我正在使用 rsync 将外部系统上传的文件移动到内部系统。但是最近有人上传了两个同名的不同文件。这意味着他们有一个来自 Month1 的文件和一个来自 Month2 的文件,但这两个文件都命名为我的日志.csv

我目前正在使用 rsync 在目录之间移动它们,它会看到更改并覆盖之前的上传。

rsync -rutv --remove-source-files /external/intake/ /internal/intake/

外部路径确实包含额外的子目录,即:

/external/intake/project/user/(additional directories they may build while uploading files)

我想做的是在文件在目录之间移动时为其添加时间戳。这样,如果使用复制时间戳复制它们,我至少会看到其中有两个。如果我能得到类似20201009:0800-mylog.csv和的结果202001009:0810-mylog.csv。移动后的完整路径将如下所示:

/external/intake/project/user/(possible additional directories)/$time-file.txt

答案1

rsync 不支持挂钩或重命名结构,但我认为您有几种选择。

选项 1——纯 rsync

如果你愿意稍微改变一下输出格式,你可以为每一步创建一个新的目录,并加上时间戳。当你有类似

/somedir
    /somedir/oldtime
        /somedir/oldtime/file1.txt
        /somedir/oldtime/file2.txt
...
/external/intake
    /external/intake/file1.txt (NEWER)

你可以通过以下方式同步它rsync -rutv --remove-source-files /external/intake/ /somedir/newtime --link-dest="/somedir/oldtime" --compare-dest="/somedir/oldtime"。结果结构如下

/somedir
    /somedir/oldtime
        /somedir/oldtime/file1.txt
        /somedir/oldtime/file2.txt
    /somedir/newtime
        /somedir/newtime/file1.txt
        /somedir/newtime/file2.txt -> /somedir/oldtime/file2.txt (LINKED)

由于这些链接,您不需要有任何额外的磁盘使用,因此您可以避免大小快速爆炸,但它与您确切要求的有点不同。

选项 2——bash

这将完全按照您的要求执行,但不会使用 rsync。您将错过与 rdiff 相关的加速,但由于您实际上并未将其用于此目的,因此它不会产生任何影响。

这是一个简短的 bash 脚本,应该可以满足您的要求。它应该完全按照您的要求重复行为。

#! /bin/bash
# command syntax: arg1 is source, arg2 is dest

# Get timestamp in nice format
dir=$(pwd)
time=$(date +"%m-%d-%Y")
# Loop through each file
cd $1
find . -type f |
while read -r line
do
    cd $dir
    echo "processing $line"
    # Check if it exisits
    if [ -f "$2/$line" ]; then
        # Copy over, but add timestamp
        base=$(basename "$line")
        fdir=$(dirname "$line")
        echo "cp $1/$line $2/$fdir/$time-$base"
        cp "$1/$line" "$2/$fdir/$time-$base"
    else
        # Copy over, no timestamp
        echo "cp $1/$line $2/$line"
        cp "$1/$line" "$2/$line"
    fi
done

# Remove source here if you really want

它很丑,但能用。不管怎么说,这只是一个框架。我在非常有限的情况下对其进行了测试,并确保它在使用前完全正常工作。

相关内容