如何使用 rsync 使脚本更好

xra*_*alf 5 shell scripting rsync

我有以下脚本用于rsync备份和同步我的文件。

如何使这个脚本更紧凑、更快并且具有更好的错误处理能力?

#!/bin/sh
  
errors=""

sudo rsync -avh --delete --no-o --no-g /home/xralf/audio /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
  echo "no errors in audio"
else
  errors="${errors}error in audio\n"
fi

sudo rsync -avh --delete --no-o --no-g /home/xralf/books /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
  echo "no errors in books"
else
  errors="${errors}error in books\n"
fi

sudo rsync -avh --delete --no-o --no-g /home/xralf/source_code /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
  echo "no errors in source_code"
else
  errors="${errors}error in source_code\n"
fi

# more such directories with this code pattern

echo ${errors}
Run Code Online (Sandbox Code Playgroud)

后来我打算不看脚本执行,所以我只想看到结果并相信一切顺利。我运行了脚本,但最终,我拥有的唯一信息是error in source_code,我看不到错误到底是什么(哪个文件导致了它)。

ter*_*don 5

如果您不被迫使用sh但可以使用更复杂的 shell bash,例如 ,您可以执行以下操作:

#!/bin/bash

dirs=( "audio" "books" "source_code" );
errors=()
for dir in "${dirs[@]}"; do
  sudo rsync \
       -avh --delete --no-o --no-g \
       /home/xralf/"$dir" \
       /media/extdevice/rsync_backups/ &&
    echo "no errors in $dir" ||
      errors+=("error in $dir\n")
done

printf '%s\n' "${errors[@]}"
Run Code Online (Sandbox Code Playgroud)

您可能还想捕获 stderr,但这与您的脚本执行相同的操作。


Uri*_*iel 5

如果您的首要任务是紧凑快速(即:最大限度地减少进程数量,但在这种情况下,您受到磁盘 IO 的限制,而不是受到 CPU 或内存的限制):

#!/bin/bash
sudo rsync -a --delete --no-o --no-g \
       /home/xralf/{audio,books,source_code} \
       /media/extdevice/rsync_backups/ &&
    echo "rsync completed successfully" 1>&2 || echo "rsync ended with errors" 1>&2
Run Code Online (Sandbox Code Playgroud)

删除该-v选项将使输出的噪音更少,以便您可以专注于显式错误(如果有)。将1>&2STDOUT 重定向到 STDERR,以便将错误消息发送到预期的位置。如果无人值守运行,以下替代方案可能是比内置更好的选择echo,但代价是额外的进程:

  1. 服务器可以用来logger将消息发送到syslog集中处理。确切的语法取决于服务器配置。

  2. 用于date添加计时信息,脚本的最后一行变为:

date +"[%Y/%m/%d %H:%M:%S] rsync completed successfully" 1>&2 || \
date +"[%Y/%m/%d %H:%M:%S] rsync ended with errors" 1>&2
Run Code Online (Sandbox Code Playgroud)

输出类似的东西[2022/12/05 14:37:27] rsync completed successfully