타임스탬프가 포함된 zip 파일 만들기

타임스탬프가 포함된 zip 파일 만들기

타임스탬프가 있는 디렉터리를 압축하여 동일한 서버의 다른 위치로 이동하는 스크립트를 만들려고 했지만 TESTDATE를 zip 파일에 표시할 수 없어 파일 이름이 .zip이 됩니다.

#!/bin/sh

# date
TESTDATE="date +%b-%d-%y"

# dirs to backups
DIRS="/volume1/NetBackup"

# Save zip file elsewhere on the server
DEST="/volume1/NetBackup/Backup"

# set to "no" keep old zip file and add new file
DELETE_OLD_ZIP_FILES="no"

#Path to binary files
BASENAME=/usr/bin/basename
ZIP=/usr/syno/bin/zip

for d in $DIRS
do
echo $DIRS
    zipfile="${DEST}/$(${TESTDATE} ${d} ${BASENAME}).zip"
    echo -n "Creating $zipfile..."
            # create zip file
                ${ZIP} -r $zipfile $d &>/dev/null && echo "Done!"
                done

답변1

거기에는 다양한 문제가 있습니다.

  • date +%b-%d-%y먼저 명령의 결과를 변수 에 할당하려고 합니다 TESTDATE. 그렇게 하려면 다음을 사용해야 합니다.명령 대체:

    TESTDATE=$(date  +%b-%d-%y)
    

    스크립트가 현재 수행 중인 작업은 명령 결과가 아니라 문자열을 date +%b-%d-%y에 할당하는 것입니다. TESTDATE다음을 실행하여 테스트할 수 있습니다.

    TESTDATE="date +%b-%d-%y"
    echo $TESTDATE 
    

    인쇄됩니다 date +%b-%d-%y.

  • 둘째, 사용해서는 안되는 명령 대체를 사용하고 있습니다. 원하는 것은 다음과 같습니다.

      zipfile="${DEST}/${TESTDATE} ${d} ${BASENAME}.zip"
    

    따라서 괄호를 원하지 않습니다. 나는 또한 당신이 그곳에서 무엇을 하려는지 전혀 모릅니다 basename. basename기본 프로그램이므로 사용하기 위해 변수에 넣을 필요가 없습니다. 위 명령은 /volume1/NetBackup/Backup/${TESTDATE} ${d} /usr/bin/basename유효한 파일 이름이 아닌 zipfile을 설정합니다. basename으로 무엇을 하려는지 설명해 주시면 도움을 드릴 수 있지만 현재로서는 의미가 없습니다.

  • DIRS당신은 그것이 목록이라고 생각하는 것 같지만 그렇지 않습니다. 그것은 단지 단일 디렉토리입니다 /volume1/NetBackup.

  • 또 다른 점은 스타일의 문제입니다. 환경 변수는 모두 대문자이고 동일한 이름을 사용하면 문제가 발생할 수 있으므로 항상 CAPITAL 변수 이름을 사용하지 않아야 합니다.

그래도,만약에여기서 무엇을 하려는지 이해합니다. 다음과 같이 스크립트를 작성할 수 있습니다. ( dirs당신이 원하는 것이라고 생각하기 때문에 배열로 만들었습니다.)

#!/usr/bin/env bash

# date
testdate=$(date +%b-%d-%y)

# dirs to backup
dirs=("/volume1/NetBackup" "/volume1/foobar")

# Save zip file elsewhere on the server
dest="/volume1/NetBackup/Backup"

# set to "no" keep old zip file and add new file
delete_old_zip_files="no"

#Path to binary files
zip=/usr/syno/bin/zip

base=$(/usr/bin/basename ${dest})
echo "bb $base";

for d in ${dirs[@]}
do
    ## I assume this is what you wanted to do, it will just
    ## return the name of the current $d directory
    base=$(/usr/bin/basename ${d})
    zipfile="${dest}/${testdate} ${base}.zip"
    echo -n "Creating $d $zipfile..."
    # create zip file
    ${zip} -r $zipfile $d  && echo "Done!" || echo ""
done

위의 예제 스크립트는 /volume1/NetBackup/Backup/Mar-05-14 NetBackup.zip및 를 생성합니다 /volume1/NetBackup/Backup/Mar-05-14 foobar.zip. 그건 그렇고, 공백이 포함된 파일 이름을 만들지 말 것을 강력히 제안합니다. 나중에 감사하게 될 것입니다.

관련 정보