Ich verwende CentOS 5.5 und möchte eine große Anzahl von Ordnern innerhalb eines Volumes verschieben , wobei deren Größe erhalten bleibt mtime
.
Die beste Lösung, die ich finden konnte, ist wie folgt:
cp -p -r source/data target/
rm -rf source/data
Mit mehr als 1 TB Daten auf einer NFS-Freigabe dauert das Kopieren ewig. Ich möchte nicht kopieren. Ich möchte sofort umziehen.
Wenn ich einen Ordner mit verschiebe mv source/data target/
, wird die mtime
Uhrzeit des Ordners (nicht der Dateien) auf die aktuelle Uhrzeit eingestellt. Dies liegt daran, dass der Inhalt des Ordners, den ich verschiebe, durch diesen Vorgang geändert wird (der ..
Eintrag verweist auf einen anderen Inode).
Ich habe mir ein Shell-Skript ausgedacht, das ich aufgerufen habe mv_preserve_mtime.sh
:
#!/bin/bash
# Moves source folder to target folder.
# You are responsible for making sure the target does not exist, otherwise this blows up
export timestamp=`stat -c %y $1`
mv "$1" "$2"
touch --date="${timestamp}" $2
Nun, das hat auch nicht funktioniert. Der Ordner mtime
wird wiederhergestellt, aber alle Ordner in dem Ordner, den ich verschiebe (nur die Ordner mit einer Tiefe von 1 Ebene) werden mtime
aus Gründen, die ich nicht verstehe, zurückgesetzt.
Hat jemand eine richtige, effiziente und korrekte Lösung?
touch
nicht geklappt hat. Ist es dermv
Schritt oder dertouch
Schritt, der die Zeit der Unterverzeichnisse ändert? Welches Betriebssystem befindet sich auf dem NFS-Server und (falls bekannt) welcher Dateisystemtyp?mv
Schritt, der Ärger verursacht. Der NFS-Server ist eigentlich ein NetApp-Speicher, ich weiß so gut wie nichts über seine Interna.touch
hätte das funktionieren sollen. Übrigens wäre ein tragbarer Wegtouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
.stat
war nicht tragbar.Antworten:
POSIX
mv
bietet keine Option, um die Beibehaltung von Uhrzeit und Uhrzeit anzufordern. Da der Vorgang jedoch lokal für dasselbe Volume ausgeführt wird, können Sie diecp
Verwendung von Hardlinks anfordern, anstatt die Daten der regulären Dateien mithilfe der folgenden-l
Option zu kopieren :Da nur Verzeichnisse und Dateiverweise kopiert werden, sollte es viel schneller gehen:
Weitere Informationen zu Hardlinks finden Sie auf der entsprechenden Wikipedia-Seite
Die Ursache für das Zurücksetzen der Unterverzeichnisse mtime mit Ihrer aktuellen Lösung liegt darin, dass Sie nur das übergeordnete Verzeichnis mtime abrufen und wiederherstellen: touch ist kein rekursiver Befehl.
quelle
mv
gibt es keine "rekursive" Option, ein Abstieg in Unterverzeichnisse wird nur durchgeführt, wenn eine tatsächliche Kopie (zum Beispiel verschiedene Volumes) benötigt wird.mv
in einem Verzeichnisdata
, würde ich einfach die Änderung..
in dendata
‚s Inhalt und ändern Sie diesource
undtarget
Verzeichnisse richtig die verschobene Artikel aufzulisten. Keine anderen Verzeichnisse müssten berührt werden.rename
Syscall-Implementierung durch den Kernel und die verwendeten Dateisysteme abhängig zu sein , wobei NFS seine Freigabe zum Problem hinzufügt. Es gibt einige Verweise auf diese Art von Inkonsistenzen: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…Eine andere Lösung kann sein:
quelle