Похожие вопросы

Linux zip и исключить каталог в сценарии Bash

Я пытаюсь написать сценарий bash/shell, чтобы заархивировать определенную папку и игнорировать некоторые вложенные папки в этой папке.

Это папка, которую я пытаюсь zip"sync_test5":

enter image description here

мой сценарий 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"

теперь этот скрипт работает без ошибок, однако это не игнорируя исключая Дирс я указал.

Итак, у меня был выходной скрипт команду, которую он пытался бежать, что было:

zip -r 12-08-2014_072810.website.zip sync_test5 -x  sync_test5/dir_to_ignore/*** sync_test5/dir2_to_ignore/***

теперь, если я запускаю приведенную выше команду непосредственно в putty, как это, он работает:

enter image description here

Итак, почему мой скрипт оболочки не исключает работу по назначению? выполняемая команда идентична (в оболочке и непосредственно в putty).

5
задан Community
источник

2 ответов

Я не вижу, что вы пытаетесь достичь с "**\*" в списке исключений, но, как я читал,- x исключает файлы, имена которых соответствуют шаблону, и не учитывает каталоги, в которых они находятся.

самый простой способ исключить каталоги временно удалить разрешение на выполнение из них, например: -

chmod -x ...
zip ...
chmod +x ...

просто убедитесь, что вы восстановить разрешение на выполнение, если вы прервать сценарий по любой причине.

0
отвечен AFH 2014-08-12 12:21:24
источник

По данным этого ответа, 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, и в командной строке нет глобуса файлов.

0
отвечен zerodiff 2017-03-20 10:04:35
источник

Другие вопросы bash command-line linux shell zip