55 lines
1.2 KiB
Text
55 lines
1.2 KiB
Text
|
#!/usr/bin/env bash
|
||
|
# this script should run as the 'git' user, not root, because 'root' should not
|
||
|
# own intermediate directories created by rsync.
|
||
|
#
|
||
|
# Example invocation:
|
||
|
# find /var/opt/gitlab/git-data/repositories -maxdepth 2 | \
|
||
|
# parallel-rsync-repos transfer-success.log /var/opt/gitlab/git-data/repositories /mnt/gitlab/repositories
|
||
|
#
|
||
|
# You can also rsync to a remote destination.
|
||
|
#
|
||
|
# parallel-rsync-repos transfer-success.log /var/opt/gitlab/git-data/repositories user@host:/mnt/gitlab/repositories
|
||
|
#
|
||
|
# If you need to pass extra options to rsync, set the RSYNC variable
|
||
|
#
|
||
|
# env RSYNC='rsync --rsh="foo bar"' parallel-rsync-repos transfer-success.log /src dest
|
||
|
#
|
||
|
|
||
|
LOGFILE=$1
|
||
|
SRC=$2
|
||
|
DEST=$3
|
||
|
|
||
|
if [ -z "$LOGFILE" ] || [ -z "$SRC" ] || [ -z "$DEST" ] ; then
|
||
|
echo "Usage: $0 LOGFILE SRC DEST"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if [ -z "$JOBS" ] ; then
|
||
|
JOBS=10
|
||
|
fi
|
||
|
|
||
|
if [ -z "$RSYNC" ] ; then
|
||
|
RSYNC=rsync
|
||
|
fi
|
||
|
|
||
|
if ! cd $SRC ; then
|
||
|
echo "cd $SRC failed"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
rsyncjob() {
|
||
|
relative_dir="./${1#$SRC}"
|
||
|
|
||
|
if ! $RSYNC --delete --relative -a "$relative_dir" "$DEST" ; then
|
||
|
echo "rsync $1 failed"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
echo "$1" >> $LOGFILE
|
||
|
}
|
||
|
|
||
|
export LOGFILE SRC DEST RSYNC
|
||
|
export -f rsyncjob
|
||
|
|
||
|
parallel -j$JOBS --progress rsyncjob
|