Я пытаюсь написать сценарий 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"

Теперь этот скрипт выполняется без ошибок, однако он не игнорирует / исключает указанные мной каталоги.

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

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

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

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

2 ответа2

0

Согласно этому ответу, 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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .