Korzystam z CentOS 5.5 i chciałbym przenieść dużą liczbę folderów w jednym woluminie , zachowując je mtime
.
Najlepsze rozwiązanie, jakie mogłem znaleźć, to:
cp -p -r source/data target/
rm -rf source/data
Przy ponad 1 TB danych w udziale NFS kopiowanie trwa wiecznie. Nie chcę kopiować. Chcę natychmiastowego ruchu.
Kiedy przenoszę folder za pomocą mv source/data target/
, mtime
folder (nie pliki) zostaje ustawiony na bieżącą godzinę. Jest tak, ponieważ zawartość folderu, który przenoszę, zostaje zmodyfikowana przez tę operację ( ..
pozycja wskazuje na inny i-węzeł).
Wymyśliłem następujący skrypt powłoki, który zadzwoniłem 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
Cóż, to też nie działało. Folder mtime
został przywrócony, ale wszystkie foldery w folderze, które przenoszę (tylko te o głębokości 1 poziomu) otrzymują mtime
reset z przyczyn, których nie rozumiem.
Czy ktoś ma właściwe, wydajne i prawidłowe rozwiązanie?
touch
nie zadziałała. Czy jest tomv
krok, czytouch
krok, który zmienia mtime podkatalogów? Jaki system operacyjny znajduje się na serwerze NFS i (jeśli wiesz) jaki typ systemu plików?mv
krok powoduje kłopoty. Serwer NFS jest w rzeczywistości pamięcią NetApp, nie wiem praktycznie nic o jego wewnętrznych elementach.touch
powinno było działać. Nawiasem mówiąc, byłby to bardziej przenośny sposóbtouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
.stat
jest przenośny.Odpowiedzi:
POSIX
mv
nie zapewnia żadnej opcji żądania zachowania atime / mtime, ale ponieważ operacja jest lokalna dla tego samego woluminu, możesz poprosićcp
o użycie twardych linków zamiast kopiowania danych zwykłych plików za pomocą-l
opcji:Ponieważ tylko katalogi i odwołania do plików zostaną faktycznie skopiowane, powinno pójść znacznie szybciej:
Więcej informacji na temat twardych linków można znaleźć na odpowiedniej stronie Wikipedii
Jeśli chodzi o to, dlaczego w bieżącym rozwiązaniu resetuje się podkatalogi mtime, to dlatego, że dostajesz i przywracasz tylko katalog macierzysty mtime: touch nie jest poleceniem rekurencyjnym.
źródło
mv
nie ma opcji „rekurencyjnej”, zejście do podkatalogów odbywa się tylko wtedy, gdy potrzebna jest rzeczywista kopia (na przykład różne woluminy).mv
na katalogudata
, chciałbym po prostu zmienić..
się wdata
„s zawartości i modyfikowaćsource
itarget
katalogów o wymienieniu Element został przeniesiony prawidłowo. Żadnych innych katalogów nie trzeba będzie dotykać.rename
implementacji syscall przez jądro i używany system plików, a NFS dodaje swój udział w problemie. Istnieje pewien wskaźnik odnoszący się do tego rodzaju niespójności: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…Innym rozwiązaniem może być:
źródło