선택한 파일 및 디렉터리의 자동 tar 백업을 위한 Bash 스크립트

선택한 파일 및 디렉터리의 자동 tar 백업을 위한 Bash 스크립트

Linux 환경의 특정 디렉토리에서 모든 항목을 선택해야 합니다.문서특정 날짜(예: 7일) 이후 및 모든 날짜 이후 수정목차(루트 디렉토리에만 있으므로 재귀적이지 않음) 동일한 날짜 이후에 생성되었습니다.

그 후에는 마지막으로 주어진 규칙을 제외하고 3개의 디렉터리를 처리해야 합니다. 이를 위해 프로세스는 각 패스에서 반복적이어야 합니다. 이 디렉터리 중 하나에는 어쨌든 제외해야 할 파일이 있습니다.

마지막으로 이러한 패턴과 일치하는 모든 개체를 단일 .tar 아카이브에 추가해야 합니다. 물론 각 파일/디렉터리는 .tar 파일에서 전체 상대 경로(기본 디렉터리의)를 유지해야 합니다.

그럼 다음과 같은 결과가 있다고 가정해 보겠습니다.

myHome
|-- normalDir1                  //  older than 7 days
|   |-- blah.txt
|   |-- to_be_excluded_nmw.txt  //  should never be included anyways
|   `-- poems.txt
|-- normalDir2                  //  created yesterday
|   |-- blah2.txt               /*
|   |-- whatever2.txt            *  Since it's a normal directory,
|   |-- whatever3.txt            *  I want to exclude these files from .tar
|   `-- poems2.txt               */  
|-- exceptionDirectory1         //  older than 7 days
|   |-- actions                 //  older than 7 days
|   |   `-- power.sh            //  older than 7 days
|   `-- events                  //  older than 7 days
|       |-- deploy.php          //  older than 7 days
|       `-- set.php             //  older than 7 days
|-- exceptionDirectory2         //  older than 7 days
|   |-- actions2
|   |   `-- power2.sh           //  created yesterday
|   `-- events2                 //  older than 7 days
|       |-- deploy2.php         //  created yesterday
|       `-- set2.php            //  older than 7 days
|-- file_to_be_updated.php      //  created yesterday
`-- file_NOT_to_be_updated.php  //  older than 7 days

생성된 .tar에는 다음이 포함되어야 합니다.

./normalDir2/
./exceptionDirectory2/actions2/power2.sh
./exceptionDirectory2/events2/deploy2.php
./file_to_be_updated.php

나는 이 스크립트를 만들었습니다:

#!/bin/bash
TODAY=`date --rfc-3339=date`
FILENAME=$TODAY-package.tar
find ./require ! -name db_connection.php         ! -path ./require -mtime -7 -print | xargs tar cvf `date --rfc-3339=date`-package.tar
find ./img                                       ! -path ./img     -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
find ./plugin                                    ! -path ./plugin  -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
find . -maxdepth 1 ! -name $TODAY-package.tar.gz ! -path .         -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar

그러나 다음 오류와 함께 거의 즉시 종료되므로 작동하지 않는 것 같습니다.

tar: ./img: Impossibile open: Is a directory

"require", "img" 및 "plugin"은 재귀적으로 처리되는 세 가지 특수 디렉터리입니다. 스크립트에 문제가 있나요? 도와주셔서 감사합니다.

답변1

.txt 아래의 파일 이름에 공백이나 기타 특수 문자가 있으면 오류가 발생합니다 ./img.

-print옵션을 사용하지 말고 find, 대신 `xargs'에 해당하는 옵션을 사용하세요 -print0:-0

 find ./img ! -path ./img -mtime -7 -print0 | xargs -0 tar uvf `date --rfc-3339=date`-package.tar

답변2

  • 대신 .find ./foo ! -path ./foofind -mindepth 1 ./foo~에지정된 경로를 인쇄합니다.
  • GNU가 있다면 다음과 같이 작성할 수 있습니다 tar.--exclude=PATTERN

    today="$(date --rfc-3339="date")"
    last_week="$(date --rfc-3339="date" --date="-7 days")"
    tar --no-recursion --exclude=db_connection.php --after-date="$last_week" cvf "${today}-package.tar" .
    tar --after-date="$last_week" uvf "${today}-package.tar" ./require ./img ./plugin
    

답변3

작동하는지 확인하기 위해 즉시 작성했습니다.

tar cvf   --no-recursion --after-date $yourdate $TarFile * */* 
tar uvrf  --after-date $yourdate $TarFile ./require ./plugin ./img

관련 정보