J'utilise CentOS 5.5 et je souhaite déplacer une grande quantité de dossiers dans un volume , en conservant leur mtime
.
La meilleure solution que j'ai pu trouver est la suivante:
cp -p -r source/data target/
rm -rf source/data
Avec plus de 1 To de données sur un partage NFS, la copie prend une éternité. Je ne veux pas copier. Je veux un mouvement instantané.
Lorsque je déplace un dossier à l'aide de mv source/data target/
, le mtime
dossier (et non les fichiers) est réglé sur l'heure actuelle. En effet, le contenu du dossier que je déplace est modifié par cette opération (l' ..
entrée pointe vers un autre inode).
J'ai trouvé un script shell suivant que j'ai appelé 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
Eh bien, cela n'a pas fonctionné non plus. Le dossier mtime
est restauré, mais tous les dossiers du dossier que je déplace (seulement ceux de 1 niveau de profondeur) sont mtime
réinitialisés pour des raisons que je ne comprends pas.
Quelqu'un a-t-il une solution appropriée, efficace et correcte?
touch
n'a pas fonctionné. Est-ce l'mv
étape ou l'touch
étape qui modifie le mtime des sous-répertoires? Quel système d'exploitation est sur le serveur NFS et (si vous le savez) quel type de système de fichiers?mv
étape qui cause des ennuis. Le serveur NFS est en fait un stockage NetApp, je ne sais pratiquement rien de ses composants internes.touch
aurait dû fonctionner. Soit dit en passant, un moyen plus portable seraittouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
.stat
n'était pas portable.Réponses:
POSIX
mv
ne fournit aucune option pour demander la conservation atime / mtime, mais comme l'opération est locale sur un même volume, vous pouvez demandercp
à utiliser des liens physiques au lieu de copier les données des fichiers normaux en utilisant l'-l
option:Étant donné que seuls les répertoires et les références de fichiers seront réellement copiés, cela devrait aller beaucoup plus vite:
Pour plus d'informations sur les liens physiques, vous pouvez consulter la page Wikipedia correspondante
Quant à savoir pourquoi les sous-répertoires mtime sont réinitialisés avec votre solution actuelle, c'est parce que vous obtenez et restaurez uniquement le répertoire parent mtime: touch n'est pas une commande récursive.
la source
mv
n'a pas d'option "récursive", la descente dans les sous-répertoires n'est effectuée que si une copie réelle (différents volumes, par exemple) est nécessaire.mv
sur un répertoiredata
, je changerais simplement le..
dans ledata
contenu de et modifierais les répertoiressource
ettarget
pour lister correctement l'élément déplacé. Aucun autre répertoire n'aurait besoin d'être touché.rename
implémentation syscall sous-jacente par le noyau et le ou les systèmes de fichiers utilisés, NFS ajoutant son partage au problème. Il existe des pointeurs référençant ce type d'incohérences: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…Une autre solution peut être:
la source