rsync --exclude'folder',无论如何都要复制该文件夹

时间:2016-01-14 11:49:38

标签: bash find backup rsync

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

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

无论我如何使用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

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

剧本:

#!/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

我确定我错过了一些东西,但我找不到它!先谢谢你的伙伴

3 个答案:

答案 0 :(得分:0)

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

ResourceLeakDetector.setLevel(PARANOID)

答案 1 :(得分:0)

@Nihvel was right

#define RUNDE(n) ( K ^= Q[n], y = K, K = F(K) ^ xR, xR = y )

无论本地文件说明符是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还是其他内容,这都有效。

答案 2 :(得分:0)

您应该能够通过不在选项周围添加引号或包含空格而不是使用--exclude来解决=问题; rsync关于如何编写选项非常特别:

--exclude=backup

替代

--exclude '*dir'

其他建议:

  1. 删除变量的尾部斜杠(rsync非常具体关于/
  2. 对于命令替换,请使用$( ... )而不是反引号(如果可用/可能)
  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在遇到包含空格的文件名时不会中断,您需要在find方法中处理它。 *你可以通过使用rsync命令而不是find来进一步优化你的脚本,但我会把它留给你。