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'
其他建议:
- 删除变量的尾部斜杠(rsync 非常具体
/
)
- 对于命令替换,使用
$( ... )
而不是反引号(如果 available/possible)
- 消除冗余代码(例如,你定义了
$BACKUPDIR
但只使用一次有效)
- 遇到问题时总是使用
--verbose
选项,它对 rsync 确实有帮助
修改后的脚本:
#!/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
来进一步优化您的脚本,但我会把它留给您。
我知道有很多关于此的帖子,但我尝试了所有但仍然无法正常工作。
如果这是我要备份的文件夹:/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'
其他建议:
- 删除变量的尾部斜杠(rsync 非常具体
/
) - 对于命令替换,使用
$( ... )
而不是反引号(如果 available/possible) - 消除冗余代码(例如,你定义了
$BACKUPDIR
但只使用一次有效) - 遇到问题时总是使用
--verbose
选项,它对 rsync 确实有帮助
修改后的脚本:
#!/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
来进一步优化您的脚本,但我会把它留给您。