我想编写一些备份脚本,但我需要排除一些目录。所以我决定将所有排除的目录设置在这样的数组中。
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
默认情况下, ,和es
shellfish
对数组进行这种处理,因此在这些 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-from
switch 来处理多个位置
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