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