Bash 腳本中的 Linux zip 與排除目錄

Bash 腳本中的 Linux zip 與排除目錄

我正在嘗試編寫 bash/shell 腳本來壓縮特定資料夾並忽略該資料夾中的某些子目錄。

這是我要壓縮的資料夾“同步測試5」:

在此輸入影像描述

我的 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,並且在命令列上不會出現檔案全域匹配。

相關內容