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

12

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?

mac1234
quelle
1
Ok, ich glaube, es funktioniert mit:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234
Wäre rsync nicht das bessere Werkzeug für diese Aufgabe anstelle von cp? rsync -a Quelle Ziel
Darryl

Antworten:

9

Einige Implementierungen von cphaben eine -tOption, sodass Sie das Zielverzeichnis vor die Dateien stellen können:

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

Beachten Sie, dass dies -aimpliziert, --preserveso dass ich letztere entfernt habe.

Glenn Jackman
quelle
3

Sie können paxdies wie folgt verwenden:

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

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

  • -wr- Wenn paxsowohl Ritus- -wals auch -read-Optionen übergeben werden, werden diese kopiert. Möglicherweise auch hier nützlich. (aber nicht im obigen Befehl enthalten)

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

    • -Xzum Beschränken paxauf dasselbe Quellgerät und / oder Dateisystem.

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

    • -verbose - für die Berichterstattung über Dateien, die bezogen / gezielt sind.

  • -T- Die -TOption ime wählt Dateien für das Zielarchiv aus (oder nur zum Kopieren, wenn sie mit verwendet werden -wr), basierend auf ihrer /mOdifizierung oder Inode /cHange (oder beiden) Zeiten. 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]

  • Wo ccdie ersten beiden Ziffern des Jahres (das Jahrhundert) sind, yysind die letzten beiden Ziffern des Jahres, die erste mmist der Monat (von 01 bis 12), ddist der Tag des Monats (von 01 bis 31), HHist die Die Stunde des Tages (von 00 bis 23) MMist die Minute (von 00 bis 59) und SSdie Sekunden (von 00 bis 59). Das Minutenfeld MMist erforderlich, während die anderen Felder optional sind und in der folgenden Reihenfolge hinzugefügt werden müssen:

    HH, dd, mm, yy, cc

  • Das SSFeld 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 -Tkönnen mehrere Zeitbereiche angegeben werden und die Überprüfung stoppt beim ersten Spiel.

... also ist der 11Befehl dort oben in meinem Beispiel relativ zu heute - es ist eins weniger als das heutige Datum - das ist 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. Alle Dokumente beziehen sich auf nicht spezifiziertes Verhalten für relative Zielpfade - und als ich das erste Mal versuchte, paxes zu verwenden, fluchte ich eine Stunde lang in Verwirrung mit all den seltsamen Ergebnissen, bis ich einen absoluten Pfad verwendete.

mikeserv
quelle
2

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!

mac1234
quelle
2

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 der temporäre 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

Amol Patil
quelle
1

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 "$@" FOLDER' sh {} +
FatihSarigol
quelle
1
Vielleicht möchten Sie lesen, warum das Schleifen über die Ausgabe von find eine schlechte Praxis ist.
Stéphane Chazelas
Danke Stephane, vielleicht konnte ich das deshalb in keinem Beitrag finden, obwohl es für meinen Fall wie ein Zauber funktionierte. wenn Sie dies tun, finden Sie nur. -type f -newermt '17 dec 2016 20:10:00 '
FatihSarigol
... es druckt die Dateien, die nach dieser Zeit erstellt wurden. Ich bin mir nicht sicher, welche Art von Problem es selbst verursachen kann. dann benutze ich einfach Backticks, um diese zu kopierenden Dateien auszuwählen. prost
FatihSarigol
Ich glaube, der Beitrag, den Sie geteilt haben, handelt von "Looping over". Schleift mein Code das Ergebnis von find? oder wählt es nur das Ergebnis von find aus, das für die Kopie verwendet werden soll? (Entschuldigung für 3 Kommentare, ich darf meine Kommentare anscheinend noch nicht bearbeiten
FatihSarigol
1
Verwenden Sie find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) oder find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU oder einige BSDs (der begrenzende Faktor für die Portabilität ist hier das -newermtPrädikat)).
Stéphane Chazelas