用於自動 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 ./foo你可以使用find -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

相關內容