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?
quelle
find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
Antworten:
Einige Implementierungen von
cp
haben eine-t
Option, sodass Sie das Zielverzeichnis vor die Dateien stellen können:Beachten Sie, dass dies
-a
impliziert,--preserve
so dass ich letztere entfernt habe.quelle
Sie können
pax
dies wie folgt verwenden:Die Befehlszeile Stück für Stück:
-wr
- Wennpax
sowohl Ritus--w
als auch-r
ead-Optionen übergeben werden, werden diese kopiert. Möglicherweise auch hier nützlich. (aber nicht im obigen Befehl enthalten)-l
Tinte - die nach Möglichkeit Hardlinks erstellt, anstatt die Dateidaten zu kopieren.-X
zum Beschränkenpax
auf dasselbe Quellgerät und / oder Dateisystem.-s/src regex/replace/
- Ändert Dateinamen im Stream-v
erbose - für die Berichterstattung über Dateien, die bezogen / gezielt sind.-T
- Die-T
Option ime wählt Dateien für das Zielarchiv aus (oder nur zum Kopieren, wenn sie mit verwendet werden-wr
), basierend auf ihrer/m
Odifizierung oder Inode/c
Hange (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
cc
die ersten beiden Ziffern des Jahres (das Jahrhundert) sind,yy
sind die letzten beiden Ziffern des Jahres, die erstemm
ist der Monat (von 01 bis 12),dd
ist der Tag des Monats (von 01 bis 31),HH
ist die Die Stunde des Tages (von 00 bis 23)MM
ist die Minute (von 00 bis 59) undSS
die Sekunden (von 00 bis 59). Das MinutenfeldMM
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
SS
Feld 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
-T
können mehrere Zeitbereiche angegeben werden und die Überprüfung stoppt beim ersten Spiel.... also ist der
11
Befehl 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,
pax
es zu verwenden, fluchte ich eine Stunde lang in Verwirrung mit all den seltsamen Ergebnissen, bis ich einen absoluten Pfad verwendete.quelle
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.
Danke noch einmal!
quelle
Ich habe genau die gleiche Funktionalität ausgeführt, musste aber die Ordnerstruktur beibehalten. Daher ist das, was ich getan habe, etwas anders.
Dabei ist $ Tage die Anzahl der Tage. $ tarpath ist der temporäre Pfad zum Speichern dieser Dateien. und als ich wiederherstellen wollte.
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
Vorteil: 1. Ich hatte immer eine Kopie von dem, was ich zuletzt wiederhergestellt habe, im komprimierten Format.
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.
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
mehr für rsyc mit datum hier
quelle
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.)
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:
quelle
find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +
(GNU) oderfind . -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-newermt
Prädikat)).