Estou usando o CentOS 5.5 e gostaria de mover uma grande quantidade de pastas em um volume , mantendo-as mtime
.
A melhor solução que eu poderia encontrar é assim:
cp -p -r source/data target/
rm -rf source/data
Com mais de 1 TB de dados em um compartilhamento NFS, a cópia leva uma eternidade. Eu não quero copiar Eu quero movimento instantâneo.
Quando movo uma pasta usando mv source/data target/
, a mtime
pasta (e não os arquivos) é definida para a hora atual. Isso ocorre porque o conteúdo da pasta que estou movendo é modificado por esta operação (a ..
entrada está apontando para um inode diferente).
Eu vim com um seguinte script de shell que chamei 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
Bem, isso também não funcionou. A pasta mtime
é restaurada, mas todas as pastas dentro da pasta que eu movo (apenas as que têm 1 nível de profundidade) são mtime
restauradas por motivos que não compreendo.
Alguém tem uma solução adequada, eficiente e correta?
touch
não funcionou. É amv
etapa ou atouch
etapa que altera o mtime dos subdiretórios? Qual sistema operacional está no servidor NFS e (se você souber) que tipo de sistema de arquivos?mv
passo que causa problemas. O servidor NFS é na verdade um armazenamento da NetApp, não sei praticamente nada sobre seus componentes internos.touch
deveria ter funcionado. A propósito, uma maneira mais portátil seriatouch -r "$1" reference.tmp; mv -- "$1" "$2"; touch -r reference.tmp -- "$2"; rm reference.tmp
.stat
era portátil.Respostas:
O POSIX
mv
não fornece nenhuma opção para solicitar preservação atime / mtime, mas como a operação é local em um mesmo volume, você pode solicitar ocp
uso de links físicos em vez de copiar dados dos arquivos regulares usando a-l
opção:Como apenas diretórios e referências de arquivo serão realmente copiados, deve ser muito mais rápido:
Para mais informações sobre links físicos, você pode consultar a página correspondente da Wikipedia
Por que os subdiretórios mtime estão sendo redefinidos com a solução atual, é porque você apenas obtém e restaura o diretório pai mtime: touch não é um comando recursivo.
fonte
mv
que não há opção "recursiva", a descida em subdiretórios é feita apenas se a cópia real (volumes diferentes, por exemplo) for necessária.mv
em um diretóriodata
, eu simplesmente mudar o..
nodata
conteúdo 's e modificar assource
etarget
diretórios para listar o item movido corretamente. Nenhum outro diretório precisaria ser tocado.rename
implementação subjacente do syscall pelo kernel e pelo (s) sistema (s) de arquivos usado (s), o NFS adicionando seu compartilhamento ao problema. Há algum ponteiro referenciando esse tipo de inconsistências: patchwork.ozlabs.org/patch/25833 bugs.opensolaris.org/bugdatabase/…Outra solução pode ser:
fonte