数组作为 tar --exclude 的值

数组作为 tar --exclude 的值

我想编写一些备份脚本,但我需要排除一些目录。所以我决定将所有排除的目录设置在这样的数组中。

exclude[0] = '/home/user/test1'
exclude[1] = '/home/user/test2'
exclude[2] = '/home/user/test3'

是否可以提供此数组作为 tar 命令的参数?

tar -zcvf $FILE $SOURCE --exclude=exclude

答案1

zsh

exclude=(
  /home/user/test1
  /home/user/test2
  /home/user/test3
)
tar  --exclude=$^exclude -zcvf $FILE $SOURCE

$^exclude语法使上面的内容扩展为

tar  --exclude=/home/user/test1 --exclude=/home/user/test2 \
     --exclude=/home/user/test3 -zcvf the-file the-source

rc默认情况下, ,和esshellfish对数组进行这种处理,因此在这些 shell 中您可以执行以下操作:

tar  --exclude=$exclude -zcvf $FILE $SOURCE

(用于set exclude /home/user/test1 /home/user/test2 /home/user/test3定义数组fish)。

答案2

命令的每个参数都是一个字符串。您无法将数组传递给该--exclude选项。您需要传递多个--exclude选项,或使用其他方法,例如--exclude-from一些 shell 有一种巧妙的方法来插入数组,并为每个元素添加前缀,但大多数(sh、bash、ksh,...)不这样做。

在所有 shell 中都有效的一件事是逐步构建命令行。

set -- tar -zcvf "$FILE" 
set -- "$@" --exclude='/home/user/test1'
set -- "$@" --exclude='/home/user/test2'
set -- "$@" --exclude='/home/user/test3'
"$@" "$SOURCE"

如果您使用的是 bash 或 ksh,并且有一组要排除的模式,则可以通过迭代该数组来构建命令行。

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
exclude_options=()
for x in "${exclude[@]}"; do
  exclude_options+=(--exclude="$x")
done
tar -zcvf "$FILE" "${exclude_options[@]}" "$SOURCE"

旧版本的 ksh 和 bash 缺少+=运算符,因此它们需要exclude_options=("${exclude_options[@]}" --exclude="$x")作为循环体。

您可以直接在命名数组变量或位置参数数组中构建命令行,而不是为排除选项构建单独的数组。

exclude=('/home/user/test1' '/home/user/test2' '/home/user/test3')
set -- tar -zcvf "$FILE"
for x in "${exclude[@]}"; do
  set -- "$@" --exclude="$x"
done
 "$@" "$SOURCE"

答案3

作为替代方案,您可以使用--exclude-fromswitch 来处理多个位置

tar --exclude-from=/home/user/exclude.txt -zcvf "$FILE" "$SOURCE"

现在,创建一个文件,每行包含一个正则表达式。

cat /home/user/exclude.txt

/home/user/test1
/home/user/test2
/home/user/test3

答案4

sudo rsync -avz -e "ssh -i your-pem-key.pem" --exclude-from=folder-name-files/exclude.txt folder-name-files/ [email protected]:folder-files/

在文件中,exclude.txt您应该提及所有被忽略的文件,例如:

/assets
.gitignore
exclude.txt

相关内容