Linux zip 和 Bash 脚本中的排除目录

Linux zip 和 Bash 脚本中的排除目录

我正在尝试编写一个 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,并且命令行上就不会出现文件通配符。

相关内容