我正在尝试编写一个 bash/shell 脚本来压缩特定文件夹并忽略该文件夹中的某些子目录。
这是我正在尝试压缩的文件夹”sync_test5“:
我的 bash 脚本生成一个忽略列表(基于)并像这样调用 zip 函数:
#!/bin/bash
SYNC_WEB_ROOT_BASE_DIR="/home/www-data/public_html"
SYNC_WEB_ROOT_BACKUP_DIR="sync_test5"
SYNC_WEB_ROOT_IGNORE_DIR="dir_to_ignore dir2_to_ignore"
ignorelist=""
if [ "$SYNC_WEB_ROOT_IGNORE_DIR" != "" ];
then
for ignoredir in $SYNC_WEB_ROOT_IGNORE_DIR
do
ignorelist="$ignorelist $SYNC_WEB_ROOT_BACKUP_DIR/$ignoredir/**\*"
done
fi
FILE="$SYNC_BACKUP_DIR/$DATETIMENOW.website.zip"
cd $SYNC_WEB_ROOT_BASE_DIR;
zip -r $FILE $SYNC_WEB_ROOT_BACKUP_DIR -x $ignorelist >/dev/null
echo "Done"
现在这个脚本运行没有错误,但是不是忽略/排除我指定的目录。
因此,我让 shell 脚本输出它尝试运行的命令,即:
zip -r 12-08-2014_072810.website.zip sync_test5 -x sync_test5/dir_to_ignore/**\* sync_test5/dir2_to_ignore/**\*
现在,如果我像这样直接在 putty 中运行上述命令,它就会起作用:
那么,为什么我的 shell 脚本不能按预期工作?正在执行的命令是相同的(直接在 shell 和 putty 中)。
答案1
我看不出您在排除列表中想要实现什么"**\*"
,但据我所知,-x 会排除名称与模式匹配的文件,并且不考虑它们所在的目录。
排除目录的最简单方法是暂时删除目录的执行权限,例如:-
chmod -x ...
zip ...
chmod +x ...
只要确保如果您因任何原因中止脚本,就恢复执行权限。
答案2
根据这个答案,https://superuser.com/a/496903/356580,你需要类似以下内容的内容:
ignorelist=""
if [ "$SYNC_WEB_ROOT_IGNORE_DIR" != "" ];
then
for ignoredir in $SYNC_WEB_ROOT_IGNORE_DIR
do
ignorelist="$ignorelist \"$SYNC_WEB_ROOT_BACKUP_DIR/$ignoredir/*\""
done
fi
您还可以使用星号进行一些奇特的转义,以便当它在命令行中被替换时,它会被转义,例如
ignorelist="$ignorelist $SYNC_WEB_ROOT_BACKUP_DIR/$ignoredir/\\*"
但每个人都有自己的选择。你想要的是,当通过替换执行命令时,它看起来像下面任何一个:
zip -r sync_test.zip sync_test -x sync_test/dir_to_ignore/\* sync_test/dir2_to_ignore/\*
zip -r sync_test.zip sync_test -x "sync_test/dir_to_ignore/*" "sync_test/dir2_to_ignore/*"
这样,星号字符就会被发送到 zip,并且命令行上就不会出现文件通配符。