rsync可以使用地址的速记/别名吗?

时间:2018-03-14 08:35:26

标签: bash rsync

我经常将文件rsync到远程计算机上的同一目录。是否可以给它一个别名,这样我就不必每次都输入它?

2 个答案:

答案 0 :(得分:1)

是。通常我会设置短脚本来定义rsync选项和srcdest目录,或者可能包含感兴趣目录的数组,用于在我管理的主机之间传输文件。我通常只是传递文件来将src和dest文件作为参数传递给该主机的别名(所以我不必输入主机名等等)。只需确保脚本是可执行的,并在.bashrc中定义别名。它工作正常。 (我通常使用rs_host发送到远程主机,并使用rsf_host的别名(f表示'来自')。

例如,假设我有一个主机valkyrie.3111skyline.com只能在我的局域网内访问。我有很多镜像,并存储软件用于更新孩子的计算机以及备份我的东西。虽然我有批量目录的备份脚本,但有时我只是将文件发送到服务器或从中获取文件。我不想打字,所以我尽可能缩短了这个过程。为此,我设置了一组别名(如上所述),rsvlrsync到valkyrie,rsfvlrsync来自valkyrie。如果我更新了.bashrc并且我想将其发送给valkyrie,我只想输入:

rsvl ~/.bashrc

同样,如果我想从valkyrie获取一个文件(比如~/dev/src-c/tmp/getline_ex.c中的一些C文件并将其传输到我当前的目录,我只想输入:

rsfvl ~/dev/src-c/tmp/getline_ex.c

我希望脚本从那里获取它。由于我知道可能存在极端情况并且我经常要确认涉及大量文件的传输,因此我让脚本接受-n--dry-run)选项,以便脚本显示将会发生什么在他们真正做之前完成。 (当你不太确定时很方便)

我将rsync脚本放在~/scr/net中(不太有创意,我知道......)。在我的.bashrc中,别名只是:

alias rsvl='/home/david/scr/net/rsyncvl.sh'
alias rsfvl='/home/david/scr/net/rsyncfvl.sh'

脚本本身只是快速而脏的帮助程序脚本,可以让我rsync按照我的意愿去做,例如rsyncvl.sh scritpt(对valkyrie)是:

#!/bin/bash --norc

desthost=valkyrie.3111skyline.com
excl='--exclude=.~* --exclude=*.class'

usage() {       ## simple usage function to display usage
cat >&2 << USG

  usage: ${0##*/} [[-n|--dry-run|'options'] src [dest (~/Documents)]

for  

  rsync [-uai[n]]'options' \$src ${desthost}:\$dest [${desthost}:~/Documents]

USG

    exit 0
}

## test for '-h' or '--help'
[ -z "$1" ] || [[ "${1:0:3}" =~ '-h' ]] && usage

## test for additional options passed to rsync
if test "${1:0:1}" == '-'; then

  # options present so src is $2, dest is $3
  src="$2"
  destfn=${3:-~/Documents}
  dest="${desthost}:${destfn}"

  # preserve '-n' capability for '-uain' test
  if test "$1" == '-n' || test "$1" == '--dry-run'; then
    echo "[DRY RUN]"
    opts='-uain'
  else
    # use options supplied for rsync
    opts="$1"
  fi

else

  # default use
  src="$1"
  destfn=${2:-~/Documents}
  dest="${desthost}:${destfn}"
  opts='-uai'

fi

## output the text of the comman executed
echo "rsync $opts $excl ${src} ${dest}"

if [[ "$src" =~ '*' ]]; then
  rsync $opts $excl ${src} "${dest}"   # allow file globbing expansion
else
  rsync $opts $excl "${src}" "${dest}"
fi

从valkyrie获取文件的脚本:

#!/bin/bash --norc

src="$1"        ## source file on srchost
dest="${2:-.}"  ## destination on local machine
srchost=valkyrie.3111skyline.com

usage() {       ## simple usage function to display usage
cat >&2 << USG
  Usage: ${0##*/} src dest ($HOSTNAME) --> rsync -uav [${srchost}:]\$src \$dest
USG

    exit 0
}

[[ -z "$1" ]] && usage

## allow '.' shorthand to set pwd as source/dest dir
[[ $src == '.' ]] && src="$(pwd)" && {
  dest="$(pwd)"
  dest="${dest%/*}"
}
[[ $src == './' ]] && src="$(pwd)/"

[[ $src =~ '/' ]] || src="$(pwd)/$src"

srcstr="${srchost}:${src}"  ## form source string

## echo command executed and execute
echo -e "\n  rsync -uav ${srcstr} ${dest}\n"
rsync -uai "${srcstr}" "${dest}"

它们总能得到改进,而且当我在大约十年前写出第一个时,我并不是那么特别(对于我现在拥有的所有其他主机而言,它已经被复制了......)所以随意改进并根据您的需求量身定制。对于基本用途,您需要做的就是将主机名更改为远程计算机的主机名,它们将正常工作。如果在没有参数的情况下运行,两者都将显示简短的 Usage ,并且to valkyrie脚本也将响应-h--help。祝你好转。

答案 1 :(得分:-1)

您可以添加alias myrsync='rsync -av -e "ssh" user@server:/path/to/sync /path/to/local/destination'之类的别名,然后将其添加到.bashrc文件中 之后你输入&#34; myrsync&#34;和命令&#34; rsync -av -e&#34; ssh&#34; user @ server:/ path / to / sync / path / to / local / destination&#34;将被执行。