파일을 Gzip으로 압축하되 일부 디렉터리|파일을 제외하고 현재 날짜를 추가합니다.

파일을 Gzip으로 압축하되 일부 디렉터리|파일을 제외하고 현재 날짜를 추가합니다.

.tar.gz디렉토리에서 파일을 생성하는 방법을 찾고 있는데 몇 가지 질문이 있습니다. 파일을 생성하는 명령은 다음과 같습니다.

tar -zcvf /path/to/compressed/file.tar.gz /path/to/compress 

그러면 하나를 얻을 수 있지만 file.tar.gz이렇게 하면 원본 소스에 대한 경로가 유지됩니다. 이것이 내가 찾고 있는 것입니다:

  • 로 압축해야 한다.tar.gz
  • 가능하다면 압축된 디렉터리의 경로는 유지되어서는 안 됩니다. 즉, 디렉터리와 그 내용만 압축하면 됩니다. 예를 들어 Windows에서 파일의 압축을 풀면 /path[folder]/to[folder]/compress[folder+content]최신 파일만 원합니다 .
  • 가능하다면 일부 디렉토리를 생략할 수 있나요? 예 나는 app/내용이 다음과 같은 압축 폴더를 좋아합니다.

    drwxrwxr-x  6 ubuntu ubuntu  4096 Feb 24 14:48 ./
    drwxr-xr-x 10 ubuntu ubuntu  4096 Feb 26 22:33 ../
    -rw-rw-r--  1 ubuntu ubuntu   141 Jan 29 06:07 AppCache.php
    -rw-rw-r--  1 ubuntu ubuntu  2040 Feb 24 14:48 AppKernel.php
    -rw-rw-r--  1 ubuntu ubuntu   267 Jan 29 06:07 autoload.php
    -rw-r--r--  1 root   root   94101 Feb 19 21:09 bootstrap.php.cache
    drwxrwxrwx  4 ubuntu ubuntu  4096 Feb 25 16:44 cache/
    -rw-rw-r--  1 ubuntu ubuntu  3958 Feb 24 14:48 check.php
    drwxrwxr-x  2 ubuntu ubuntu  4096 Feb 24 14:48 config/
    -rwxrwxr-x  1 ubuntu ubuntu   867 Jan 29 06:07 console*
    -rw-rw-r--  1 ubuntu ubuntu  6148 Jan 29 06:07 .DS_Store
    -rw-rw-r--  1 ubuntu ubuntu   143 Jan 29 06:07 .htaccess
    drwxrwxrwx  2 ubuntu ubuntu  4096 Feb 24 14:48 logs/
    -rw-rw-r--  1 ubuntu ubuntu  1118 Jan 29 06:07 phpunit.xml.dist
    drwxrwxr-x  5 ubuntu ubuntu  4096 Jan 29 06:07 Resources/
    -rw-rw-r--  1 ubuntu ubuntu 30404 Feb 24 14:48 SymfonyRequirements.php
    

    cache/그런데 디렉터리 logs/와 파일을 생략하고 싶은데 bootstrap.php.cache어떻게 해야 하나요? 그게 가능합니까?

  • 파일 이름에 현재 날짜(DD/MM/YYYY-H:M:S)를 추가해야 합니다. 어떻게 해야 합니까?

조언이나 도움을 받을 수 있나요? 이것을 Bash 스크립트에 추가하여 명령줄 대신 bash 스크립트로 실행하려고 합니다.

업데이트: 스크립트 내에서 테스트됨

다음과 같은@아리엘내 bash 스크립트에 다음 줄을 추가하라는 조언을 받았습니다.

read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory
read -e -p "Enter the filename: " filename
FILENAME = "$filename-`date +%d-%m-%Y-%X`.tgz"

cd "$directory"
tar -zcvf /home/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache --exclude composer.lock --exclude vendor

하지만 다음 오류가 발생합니다.

Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/
Enter the filename: checkengine
/usr/local/bin/script-task: line 109: FILENAME: command not found
tar: Cowardly refusing to create an empty archive

FILENAMEvar가 아닌 명령으로 간주됩니까?문서설명하다?

업데이트 2: 여전히 전체 경로를 압축하는 중입니다.

사용자의 의견 덕분에 일부 문제를 해결했으며 스크립트의 줄은 다음과 같습니다.

read -e -p "Enter the directory to compress: " -i "/var/www/html/" directory
read -e -p "Enter the filename: " filename
FILENAME="$filename"-$(date +%d-%m-%Y-%T).tgz

cd "$directory/.."
tar -zcvf /home/$FILENAME "$directory" --exclude="*cache*" --exclude=logs --exclude=bootstrap.php.cache --exclude=composer.lock --exclude=vendor --exclude=.git

남은 유일한 문제는 zip 파일에 최종 디렉터리뿐만 아니라 전체 경로가 여전히 있다는 것입니다. 예를 들어:

Enter the directory to compress: /var/www/html/lynxoft/apps/checkengine/
Enter the filename: file

이로 인해 file-28-02-2015-17:44:32.tgz압축 파일의 내용이 여전히 전체 경로를 가지게 됩니다 /var/www/html/lynxoft/apps/checkengine/. 이유는 무엇입니까?

답변1

cd타르볼 트리 구조를 시작하려는 폴더로 이동하여 상대 경로를 사용하세요 ! 예를 들어:

# Note, one folder above
cd /path/to/compress/..
# Tell tar to compress the relative path    
tar -zcvf /path/to/compressed/file.tar.gz compress

압축을 풀면 compress현재 작업 디렉터리에 폴더가 생성됩니다.

이 옵션을 사용하여 파일이나 폴더를 제외 --exclude <PATTERN>하고 파일 이름에 날짜를 추가할 수 있습니다 date +FORMAT. 예:

FILENAME="file-`date +%d-%m-%Y-%T`.tgz"
tar -zcvf /path/to/compressed/$FILENAME --exclude cache --exclude logs --exclude bootstrap.php.cache compress

답변2

이를 통해 다음을 gnu tar사용할 수 있습니다.

--transform=EXPRESSION, --xform=EXPRESSION
      Use sed replace EXPRESSION to transform file names.

이는 --xform='s|path/to/||'경로에서 제거된다는 의미입니다.path/to/

--exclude=PATTERN
      Exclude files matching PATTERN, a glob(3)-style wildcard pattern.

따라서 다음을 실행할 수 있습니다.

tar -zcvf /path/to/compressed/"$(date +%d-%m-%Y-%T)"-testdir.tar.gz \
--transform='s|^path/to/||' /path/to/compress \
--exclude='cache' --exclude='logs' --exclude='bootstrap.php.cache'

/와 함께 사용되는 표현식에는 선행이 없습니다 xform. 보다 일반적인 접근 방식:

--xform='s|^([^/]*/){2}||x'

이렇게 하면 경로의 처음 두 요소가 제거됩니다(필요한 경우 2를 다른 숫자로 대체).

관련 정보