rsync --exclude 'folder',无论如何复制那个文件夹

rsync --exclude 'folder', copies that folder anyway

我知道有很多关于此的帖子,但我尝试了所有但仍然无法正常工作。

如果这是我要备份的文件夹:/home/user/thingstobackup 该脚本将在此处和另一个以今天的日期命名的文件夹中创建一个 "backup" 文件夹。每日备份复制在里面。

无论我如何使用 rsync,"backup" 文件夹总是会从脚本的第二个 运行 开始复制到自身内部。

第一 运行:

/home/user/thingstobackup
/home/user/thingstobackup/backup/2016-01-13 #and correct file inside

第二 运行:

/home/user/thingstobackup/backup/2016-01-13 #with correct file inside
/home/user/thingstobackup/backup/2016-01-14 #with correct file inside

我会缩短这里的路径..

../backup/2016-01-14/2016-01-13/and backed up file inside..
../backup/2016-01-14/backup/
../backup/2016-01-14/backup/2016-01-13/and backed up file inside..
../backup/2016-01-14/backup/2016-01-14/empty

第2次运行后,备份文件夹复制到每个每日备份文件夹中。

脚本:

#!/bin/bash

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

# directory to backup
TOSAVE=/home/user/thingstobackup
TODAY=`date +%F`
BDIR=backup
BACKUPDIR=$TOSAVE/$BDIR/$TODAY/

# options for rsync
OPTS="-aq --exclude='backup/*'"

# find daily new file
FIND="`find $TOSAVE -mindepth 1 -mtime -1 -print`"

# MAIN #

# copy daily found inside new created daily folder
[ -d $TOSAVE/$BDIR/$TODAY ] || mkdir -p $TOSAVE/$BDIR/$TODAY
rsync $OPTS $FIND $BACKUPDIR

# delete file older than 2 weeks = 14 days
find $TOSAVE -mtime +14 -exec rm -rf {} \;

不管我怎么用--exclude='backup/*'" --exclude='backup' || --exclude 'backup/*' || --exclude 'backup'

它不排除那个文件夹..是的,我读了rsync手册:--exclude=PATTERN exclude files matching PATTERN

我确定我遗漏了什么,但就是找不到!在此先感谢队友

我不知道为什么 --exclude 在这里不起作用..但我修改了 find 命令,我设法让它起作用了。

FIND="`find $TOSAVE -mindepth 1 -type d \( -path $TOSAVE/backup \) -prune -o -mtime -1 -print`"

:

cd -- "$(mktemp --directory)"
mkdir foo bar
touch foo/foo bar/bar
other="$(mktemp --directory)"
rsync --recursive --exclude 'foo' * "$other"
ls "$other" # prints only "bar"

无论本地文件说明符是 *(如上)、./* 还是 /tmp/tmp.MGUbytm0h0/*,以及 $PWD/tmp/tmp.MGUbytm0h0 还是什么,这都有效否则。

您应该能够解决 --exclude 问题,方法是不在选项周围加上引号或包含 space 而不是使用 =rsync options的写法很讲究:

--exclude=backup

备选:

--exclude '*dir'

其他建议:

  1. 删除变量的尾部斜杠(rsync 非常具体 /
  2. 对于命令替换,使用 $( ... ) 而不是反引号(如果 available/possible)
  3. 消除冗余代码(例如,你定义了$BACKUPDIR但只使用一次有效)
  4. 遇到问题时总是使用 --verbose 选项,它对 rsync
  5. 确实有帮助

修改后的脚本:

#!/bin/env bash

# export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

# directory to backup
TOSAVE=$HOME/thingstobackup
TODAY=$(date +%F)
BDIR=backup
BACKUPDIR=$TOSAVE/$BDIR/$TODAY

# options for rsync
OPTS="-raq --exclude=$BDIR --exclude=$TODAY"

# find daily new file
FIND=$(find $TOSAVE -mindepth 1 -mtime -1 -print)

# MAIN #
# copy daily found inside new created daily folder
[ -d $BACKUPDIR ] || mkdir -p $BACKUPDIR
rsync $OPTS $FIND $BACKUPDIR

# delete file older than 2 weeks = 14 days
find $TOSAVE -mtime +14 -exec rm -rf {} \;

大部分更改是针对thingstobackup:

构建路径的方式
file1
file2
file3

运行 脚本将显示为:

file1   
file2   
file3   // files that will be included to rsync destination
|
|_______backup   // exclude=$BDIR should not be included
        |
        |________2016-01-14   // exlude=$TODAY would also be advised
                  file1
                  file2
                  file3

编辑:为了让 rsync 在遇到包含 spaces 的文件名时不中断,您需要在 find 方法中处理它。 * 您可以通过使用 rsync 命令而不是 find 来进一步优化您的脚本,但我会把它留给您。