rsync 除了复制请求的文件外,还会从工作目录中复制文件

rsync 除了复制请求的文件外,还会从工作目录中复制文件

bash -vx以下是我的备份脚本的输出片段

\+ rsync '' -avushi --stats --progress --log-file=/home/bigbird/temp/rlog/rlog1.txt /media/dataspace/data/webcasts/ /media/work/data/webcasts

发送增量文件列表

我一直都在做rsync这样的事情,直到最近一两个月才发现这个问题。这个是在 Kubuntu Oneiric 上运行的,但我想我可能在 Kubuntu Lucid 上也见过它。

脚本正在运行/home/bigbird/bin

它运行完美,只是它额外将我当前目录中的所有文件传输到目标。我rsync 在脚本中还有一秒钟对另一个目录执行相同的操作。

我只是从另一个目录再次运行它,它复制了所有这些文件。

我在任何地方都没有看到"."源代码等等。

我做了一个set | less

查看了我的所有~/bin文件

查看了我所有的别名

我不知道是什么原因造成这种情况。

我应该去哪里寻找问题?

答案1

原始代码是

DRYRUN="-n"
DRYRUN=""
...

rsync "${DRYRUN}" -avushi --stats --progress --log-file="${LOGFILE}"
 /media/dataspace/data/webcasts/ "${MOUNT}${DESTDIR}"

工作代码是

DRYRUN=1      ## for testing rsync without any file transfers
DRYRUN=0    ## for live run
...
if (( ${DRYRUN} ))
then
  rsync -n -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
else
  rsync    -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
fi

“我们遇到了敌人,他就是我们自己!”——沃尔特·凯利(Pogo 漫画)

我找到了!看不见不代表它不存在。

我不太明白发生了什么,但是,通过在 rsync 命令行中输入“${DRYRUN}”,它使 rsync 的第一个参数变为“”。显然,它被解释为 PWD,而不是错误。因此,命令是将“”和我的真实源传输到我的真实目的地,因为 rsync 接受多个源。

剩下的问题是,为什么 rsync 认为“”表示当前目录,而不是将其解释为语法错误?

答案2

你的情况很简单,你只需删除变量周围的引号:

rsync $DRYRUN -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"

但在另一种情况下,您可能需要引号,例如,如果参数是包含空格的路径,则可能定义也可能未定义。因此,这里有一个更优雅的解决方案:

linkdest="<OLD_BACKUP_PATH>"
rsync ${linkdest:+--linkdest="$linkdest"} -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"

如果 $linkdest 为空,没有什么将被插入。如果 $linkdest 不为空,则将插入 --linkdest="$linkdest"(并且它将被评估为命令而不是字符串)。

相关内容