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