我正在使用
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
去跳过多个文件和文件夹本页中的部分。