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 -print
Option für zu verwenden find
, verwenden Sie -print0
und die entsprechende -0
Option 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 ./foo
können Sie verwendenfind -mindepth 1 ./foo
. Dadurch wird sichergestellt, dass nur DateieninnenEs werden die angegebenen Pfade ausgedruckt. Wenn Sie GNU haben,
tar
kö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