Bash 스크립트의 Linux zip 및 제외 디렉터리

Bash 스크립트의 Linux zip 및 제외 디렉터리

특정 폴더를 압축하고 해당 폴더의 특정 하위 디렉터리를 무시하는 bash/셸 스크립트를 작성하려고 합니다.

이것이 제가 압축하려는 폴더입니다."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에서 직접 실행하면 작동합니다.

여기에 이미지 설명을 입력하세요

그렇다면 내 쉘 스크립트가 의도한 대로 작동하는 것을 제외하지 않는 이유는 무엇입니까? 실행되는 명령은 동일합니다(쉘과 퍼티에서 직접).

답변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으로 전송되고 명령줄에 파일 글로빙이 없습니다.

관련 정보