it-swarm.com.de

Suchen Sie nach Dateien, die neuer als ein Tag sind, und kopieren Sie sie

Ich arbeite an einem Skript, das NUR Dateien kopiert, die am letzten freien Tag erstellt wurden, in einen anderen Ordner. Das Problem, das ich habe, ist das Skript, mit dem ich alle Dateien im Quellverzeichnis kopiere, anstatt nur die Dateien, die weniger als einen Tag alt sind.

Das habe ich:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

Der obige Code kopiert alle Dateien im Quellverzeichnis. Wenn ich alle Argumente für 'cp' entferne, funktioniert es:

find . -mtime -1 -exec cp "{}" /somefolder \;

Der obige Code kopiert nur die neuesten Dateien, wie ich möchte, aber ich muss die Attribute mithilfe der cp-Argumente beibehalten.

Ich habe auch Variablen ausprobiert und für Schleifen gedacht, vielleicht war die Option -exec das Problem:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Die obige for-Schleife führt jedoch zu demselben Problem. Alle Dateien werden kopiert. Wenn ich $ files wiedergebe, werden nur die Dateien angezeigt, die ich benötige.

Wie kann ich das zum Laufen bringen?

12
mac1234

Einige Implementierungen von cp haben ein -t Option, damit Sie das Zielverzeichnis vor den Dateien ablegen können:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Beachten Sie, dass -a impliziert --preserve also habe ich letzteres entfernt.

9
glenn jackman

Sie können pax für Folgendes verwenden:

pax -wrT "11$(date +%H%M)," . /destination/folder

Die Befehlszeile Stück für Stück:

  • -wr - Wenn pax sowohl -w Ritus- als auch -r Ead-Optionen übergeben werden, werden diese kopiert. Möglicherweise auch hier nützlich. (aber nicht im obigen Befehl enthalten)

    • -l Tinte - erstellt nach Möglichkeit Hardlinks, anstatt die Dateidaten zu kopieren.

    • -X Zum Beschränken von pax auf dasselbe Quellgerät und/oder Dateisystem.

    • -s/src regex/replace/ - Ändert Dateinamen im Stream

    • -v Erbose - für die Berichterstellung über Dateien, die bezogen/ausgewählt wurden.

  • -T - Die Option -T Ime wählt Dateien für das Zielarchiv aus (oder nur zum Kopieren, wenn sie mit -wr Verwendet werden) basierend auf ihrem /m Odifizierung oder Inode /c Hange (oder beides) mal. Standardmäßig wird die Mod-Zeit verwendet. Von...

mann pax

  • ... Zeitvergleiche mit beiden Dateizeiten sind nützlich, wenn pax zum Erstellen eines zeitbasierten inkrementellen Archivs verwendet wird (nur Dateien, die während eines bestimmten Zeitraums geändert wurden, werden archiviert).

  • Ein Zeitbereich besteht aus sechs verschiedenen Feldern und jedes Feld muss zwei Ziffern enthalten. Das Format ist:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Während cc die ersten beiden Ziffern des Jahres (das Jahrhundert) sind, yy die letzten beiden Ziffern des Jahres sind, ist das erste mm der Monat (von 01 bis 12), dd ist der Tag des Monats (von 01 bis 31), HH ist die Stunde des Tages (von 00 bis 23), MM ist die Minute (von 00 bis 59) und SS sind die Sekunden (von 00 bis 59). Das Minutenfeld MM ist erforderlich, während die anderen Felder optional sind und in der folgenden Reihenfolge hinzugefügt werden müssen:

    HH, dd, mm, yy, cc

  • Das Feld SS kann unabhängig von den anderen Feldern hinzugefügt werden. Zeitbereiche sind relativ zur aktuellen Zeit, also ...

    -T 1234/cm

  • ... würde heute oder später alle Dateien mit einer Änderungs- oder Inode-Änderungszeit von 12:34 Uhr auswählen.

  • Es können mehrere -T Zeitbereiche angegeben werden, und die Überprüfung stoppt mit der ersten Übereinstimmung.

... also ist das 11 dort oben in meinem Beispielbefehl relativ zum heutigen - es ist eins weniger als das heutige Datum - das zwölfte - und der Rest ist nur ein Standardformat "$(date)" gefolgt von einem Komma.

... außer - und das Letzte, was es zu erwähnen gilt - ich verwende einen absoluten Pfad für das Zielverzeichnis - und Sie sollten es auch tun, wenn Sie es tun. Die Dokumente enthalten alle Verweise nicht spezifiziertes Verhalten für relative Zielpfade - und als ich das erste Mal versuchte, pax zu verwenden, fluchte ich eine Stunde lang in Verwirrung mit all den seltsamen Ergebnissen, bis Ich habe einen absoluten Weg benutzt.

3
mikeserv

Ich habe genau die gleiche Funktionalität ausgeführt, musste aber die Ordnerstruktur beibehalten. Daher ist das, was ich getan habe, etwas anders.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

dabei ist $ Tage die Anzahl der Tage. $ tarpath ist ein temporärer Pfad zum Speichern dieser Dateien. und als ich wiederherstellen wollte.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Das hat den Trick für mich getan.

Hinweis: Wenn Sie während der Sicherung einen Ordner ausschließen möchten, können Sie den folgenden Befehl verwenden

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Vorteil: 1. Ich hatte immer eine Kopie von dem, was ich zuletzt wiederhergestellt habe, im komprimierten Format.

  1. außerdem habe ich zwischen den Wiederherstellungen eine Pause, in der ich überprüfen kann, was diese Dateien sind. Wenn alles in Ordnung ist, fahren Sie mit dem Skript fort.

  2. Die Ordnerstruktur bleibt erhalten, daher werden nur geänderte Dateien vom Quellverzeichnis in das Zielverzeichnis überschrieben

Hinweis: Wenn die Anforderung jedoch nicht auf einen Tag beschränkt ist, würde ich rsync verwenden

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

mehr für rsyc mit datum hier

2
Amol Patil

Vielen Dank an alle für die Hilfe, die mit einer Kombination Ihrer Vorschläge funktioniert hat:

ging mit dem folgenden Code und es funktioniert perfekt.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

danke noch einmal!

2
mac1234

Man kann auch das genaue Datum und die Uhrzeit auswählen, außer auf eine bestimmte Anzahl von Tagen zurückzugreifen

(Dies funktioniert nur dann gut, wenn Ihre Dateinamen kein Leerzeichen, keine Registerkarte oder keinen Platzhalter enthalten.)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Oben kopiert alle Dateien im Verzeichnis, die nach dem 17. Dezember 2016 um 20:10:00 Uhr erstellt wurden, in den ORDNER (1 Tag vor heute :)

Seien Sie vorsichtig mit dem Symbol für den Befehl find, es ist NICHT dieses: 'es ist dies, ein Backtick: `Datumsauswahl ist mit diesem:'

Für Dateien mit Leerzeichen, Tabulatoren, Zeilenumbrüchen oder Platzhaltern im Namen können Sie eine der Lösungen von Stéphane Chazelas verwenden. Erstens für GNU, zweitens für GNU oder einige BSDs:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "[email protected]" FOLDER' sh {} +
1
FatihSarigol