exu*_*sum 8 scripting cp rsync synchronization
我正在寻找一个命令/脚本来允许将最近修改的文件(最多)10GB 复制到另一台计算机。
因此,如果有 4 个 4 GB 的文件,则脚本只应传输其中的 2 个,如果有 12 个 1GB 的文件,则应仅传输最近的 10 个。
这是一个脚本,可以满足您的要求。
它用于rsync --dry-run
构建将要传输的文件列表(这些是修改后的文件)。然后,它使用的组合du
,并ls
获得文件大小和修改时间。然后按 mtime 对文件进行排序,然后循环遍历它们,直到总大小超过阈值。最后,它再次调用 rsync 只使用最近修改的文件和低于阈值的总大小。
该脚本有点丑陋,但它有效。一个很大的限制是它必须在包含 rsync from-directory 的机器上执行。可以修改它以使用 ssh 来使用远程目录,但是这个大小留给读者。
最后,这些rsync
选项被硬编码到脚本中,但如果您想在命令行上指定它们,这是一个简单的更改。此外,计算大小的数学运算以字节为单位。通过修改对 du 的调用并将阈值降低相同的系数,可以将其更改为千/兆/千兆字节。
./rsyncrecent.sh rsync-from-directory rsync-to-directory
Run Code Online (Sandbox Code Playgroud)
其中rsync-from-directory
是本地目录,rsync-to-directory
是任何本地或远程目录。默认选项被硬编码为-avz
,默认阈值被硬编码为10GiB
。
#!/bin/bash
RSYNC=rsync
RSYNC_OPTS=-avz
THRESHOLD=10737418240
usage () {
echo >&2 "Usage: $0 from-location to-location"
exit 1
}
[ "$#" -eq 2 ] || usage
RSYNC_FROM=$1
RSYNC_TO=$2
echo "Fetching file list for $RSYNC $RSYNC_OPTS $RSYNC_FROM $RSYNC_TO"
# get list of changed files
FILES=`$RSYNC $RSYNC_OPTS --dry-run $RSYNC_FROM $RSYNC_TO | sed -n '/list$/,/^$/{/sending.*list$/ d ; /^$/ d ; /\/$/ d ;; p}'`
# reported files are relative to ..RSYNC_FROM, so rather than transforming filenames, lets just move there
pushd $RSYNC_FROM > /dev/null
# get modified time and sizes for all files
i=0
for FILE in $FILES
do
#strip first part of path so files are relative to RSYNC_FROM
FILE=${FILE#*/}
#FSIZE=`ls -l $FILE | cut -f5 -d' '`
FSIZE=`du -bs $FILE`
FMTIME=`ls -l --time-style=+%s $FILE | cut -f6 -d' '`
FLIST[$i]=`echo $FMTIME $FILE $FSIZE`
((i=$i+1))
done
# go back to original directory
popd > /dev/null
# sort list according to modified time
IFS=$'\n' FLIST=($(sort -rg <<<"${FLIST[*]}"))
max=$i
i=0
size=0
#NEWFLIST=''
# add up the files in mtime order until threshold is reached
for ((i=0; i<$max; i++))
do
s=`echo ${FLIST[$i]} | cut -f3 -d' '`
f=`echo ${FLIST[$i]} | cut -f2 -d' '`
((size=$size+$s))
if (( "$size" > "$THRESHOLD" ))
then
break
fi
NEWFLIST="$NEWFLIST $f"
echo $f >> /tmp/rsyncfilelist
done
$RSYNC $RSYNC_OPTS --dry-run $RSYNC_FROM --files-from=/tmp/rsyncfilelist $RSYNC_TO
rm /tmp/rsyncfilelist
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1867 次 |
最近记录: |