rsync 可以使用 shorthand/alias 作为地址吗?

Can rsync use shorthand/alias for an address?

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

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

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

例如,假设我有一个主机 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 脚本(对 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:0:3}" =~ '-h' ]] && usage

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

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

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

else

  # default use
  src=""
  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=""        ## 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 "" ]] && 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。祝您转账顺利。