在备份期间排除 /home 中的文件夹的简单方法是什么

在备份期间排除 /home 中的文件夹的简单方法是什么

我正在使用

for a in /home/*
do
//do backup
done

我想排除 /home 中的某些文件夹。但是 for 循环会获取那里的所有文件夹。

有什么方法可以让我指定顶部的排除列表,可以在循环中使用

答案1

您需要进行某种评估,以便检查从“for”中获得的文件夹列表中排除什么;只需使用 bash 就可以(您可以使用任何您觉得舒服的方式来评估要排除的内容(即 sed、grep、awk,...)):

exclusiondirs="/home/foo /home/bar" # list of folders to exclude from backup

for a in /home/*; do
if ! [[ "$exclusiondirs" =~ $a ]]; then
    ...do backup...
fi
done

不过,我会使用一些其他工具进行备份,比如可以自行排除的 rsync,例如:

rsync -av /home/* --exclude /home/foo --exclude /home/var destination

已编辑

由于 bash 正则表达式有点棘手并且在某些情况下难以实现,因此我用更强大的 grep 语句替换了它:

if ! echo "$exclusiondirs" | grep -q "\b$a\b" ; then

此 grep 语句将在具有如下名称的主目录中工作(其中一些目录共享通用部分名称并包含空格):

mkdir -p home/{foo,bar,foobar,a,b,c,a\ b
tree
`-- home
    |-- a
    |-- a b
    |-- b
    |-- bar
    |-- c
    |-- foo
    `-- foobar

~$ echo $exclusiondirs 
/home/foo /home/bar /home/a
~$ for a in /home/*; do if ! echo "$exclusiondirs" | grep -q "\b$a\b" ; then echo $a; fi; done
/home/a b
/home/b
/home/c
/home/foobar

答案2

跳过多个文件和文件夹本页中的部分。

相关内容