Bash-Skript für automatisches Tar-Backup ausgewählter Dateien und Verzeichnisse

Bash-Skript für automatisches Tar-Backup ausgewählter Dateien und Verzeichnisse

Innerhalb eines bestimmten Verzeichnisses in der Linux-Umgebung muss ich alle auswählenDateiennach einem bestimmten Datum (sagen wir 7 Tage) geändert werden, sowie alleVerzeichnisse(nur im Stammverzeichnis, daher nicht rekursiv) nach demselben Datum erstellt.

Danach muss ich mich um 3 Verzeichnisse kümmern, die die letzte angegebene Regel ausnehmen. Für diese muss der Prozess innerhalb jedes Verzeichnisses rekursiv sein. In einem dieser Verzeichnisse befindet sich eine Datei, die auf jeden Fall ausgeschlossen werden soll.

Schließlich muss ich alle Objekte, die diesen Mustern entsprechen, zu einem einzigen .tar-Archiv hinzufügen. Jede Datei/jedes Verzeichnis muss natürlich den vollständigen relativen Pfad innerhalb der .tar-Datei enthalten (beginnend mit dem Basisverzeichnis).

Nehmen wir also an, wir haben:

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

Die resultierende TAR-Datei sollte Folgendes enthalten:

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

Ich habe dieses Skript erstellt:

#!/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

aber es scheint nicht richtig zu funktionieren, da es fast sofort mit diesem Fehler beendet wird:

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

Beachten Sie, dass „require“, „img“ und „plugin“ die drei speziellen Verzeichnisse sind, die rekursiv behandelt werden. Was ist mit dem Skript nicht in Ordnung? Vielen Dank für Ihre Hilfe.

Antwort1

Die Fehlerursache liegt darin, dass die Dateinamen unter Leerzeichen oder andere Sonderzeichen enthalten ./img.

Anstelle der -printOption für zu verwenden find, verwenden Sie -print0und die entsprechende -0Option für „xargs“:

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

Antwort2

  • Anstelle von find ./foo ! -path ./fookönnen Sie verwenden find -mindepth 1 ./foo. Dadurch wird sichergestellt, dass nur DateieninnenEs werden die angegebenen Pfade ausgedruckt.
  • Wenn Sie GNU haben, tarkönnen Sie verwenden --exclude=PATTERN. Auf diese Weise sollten Sie in der Lage sein, etwa Folgendes zu schreiben:

    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
    

Antwort3

Ich schreibe es spontan, probiere mal aus, ob es irgendwie funktioniert

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

verwandte Informationen