Kopieren Sie Dateien, die nach einem bestimmten Datum geändert wurden, mithilfe von CP-Schaltern

7

Wenn ich den Befehl ausführe find . -mtime -60, wird die Liste der Dateien angezeigt, die in den letzten 60 Tagen geändert wurden.

Wenn ich sie ausführe, find . -mtime -60 -exec cp {} /tmp/1 \;kann ich diese Dateien zur Verarbeitung in ein neues Verzeichnis kopieren

Wenn ich jedoch die Zeitstempel beibehalten möchte, kann ich nicht nur die Dateien kopieren, die bei der Ausführung benötigt werden find . -mtime -60 -exec cp -LR --preserve=timestamps {} /tmp/2 \;

Am Ende werden ALLE Dateien im Quellverzeichnis kopiert und nicht nur die Dateien, die ich benötige.

Irgendeine Lösung hier?

cyberjar09
quelle
1
Lustigerweise habe ich heute fast genau die gleiche Frage beantwortet - unix.stackexchange.com/questions/118396/…
Graeme

Antworten:

11

Wenn Sie die -ROption verwenden cpund ein Verzeichnis als Argument angeben, wird alles in diesem Verzeichnis kopiert . Darüber hinaus wird die Verzeichnisstruktur nicht beibehalten, da Dateien in niedrigeren Verzeichnissen direkt in kopiert werden /tmp/2. Dies kann das sein, was Sie wollen (siehe X Tians Antwort, wie es auf diese Weise gemacht wird), aber Vorsicht, wenn Dateien denselben Namen haben, überschreibt eine die andere bei der Ermittlung.

Um die Verzeichnisstruktur beizubehalten, können Sie Folgendes verwenden cpio:

find . -mtime -60 -print0 | cpio -0mdp /tmp/2

Wenn die -0(oder eine gleichwertige) Option nicht verfügbar ist, können Sie dies tun. Achten Sie jedoch darauf, dass keiner Ihrer Dateinamen eine neue Zeile enthält:

find . -mtime -2 | cpio -mdp /tmp/2

cpiosollte auch die -LOption unterstützen, sei jedoch vorsichtig, da dies in einigen Fällen zu einer Endlosschleife führen kann.

Graeme
quelle
2

Sie sollten Verzeichnisse ausschließen. Bei der ersten Dateisuche werden .zusätzlich die rekursive Option für die Kopie verwendet.

Das Folgende ist also mehr das, was Sie beabsichtigt haben, aber wie Graeme betont, cpio -pdmwird die ursprüngliche Verzeichnisstruktur beibehalten und cpnur in das Zielverzeichnis kopiert.

find . -mtime -60 -type f -exec cp -Lv --preserve=timestamps {} /tmp/2 \;

Ich lasse diese Antwort, um den Unterschied zwischen Graeme und dieser Lösung hervorzuheben. Da ich denke, dass es etwas zur allgemeinen Antwort auf die ursprüngliche Frage beiträgt. Andere Leser könnten dies interessant finden.

X Tian
quelle
Sie sind besser mit +statt \;als das, was Sie wird man berufen tun cppro Datei, ist dies nicht notwendig. Dies behält auch nicht die Verzeichnisstruktur bei und kann dazu führen, dass sich einige Dateien gegenseitig überschreiben, wenn sie denselben Namen haben.
Graeme
Toller Kommentar, Sie sind auf allen 3 Konten absolut korrekt. Ich werde nur aktualisieren, um den rekursiven Verzeichnisfehler hervorzuheben.
X Tian
1

Dadurch bleiben Zeitstempel in allen Verzeichnissen und Dateien erhalten:

find . -mtime -60 -type f -exec cp --parents -fuav {} /tmp/2 \;

Getestet mit CentOS 7.2.

Reado
quelle