Mover os arquivos para fora do volume e, em seguida, de volta enquanto preserva todos os atributos?

4

Eu tenho uma situação em que estou testando um novo sistema de arquivos que tem um problema com alguns metadados. Todos os arquivos estão intactos, no entanto, eu finalmente tenho que mover cada arquivo para outro volume e imediatamente voltar ao lugar.

Obviamente, mv não fará o truque, pois não é capaz de preservar todos os atributos (principalmente todos os registros de data e hora). Eu estava pensando em algo mais ao longo das linhas de um comando de busca enquanto execiava cp -p /original/path/to/file /tmp/location/file , rm /original/path/to/file , cp -p /tmp/location/file /original/path/to/file , rm /tmp/location/file . Talvez todos esses comandos em um script que é passado para o exec find?

Eu não tenho certeza da abordagem mais eficiente aqui, mas gostaria de uma rápida entrada para ter certeza de cobrir todas as minhas bases e ter um comando preciso que não me deixe lamentando algum tipo de perda de atributo de dados quando está tudo dito e feito. Eu tenho muitas centenas de gigabytes para mudar e para trás, então eu preciso ser tão cuidadoso e tão eficiente quanto possível.

Aqui está a solução que eu criei até agora e adoraria alguma entrada:

Script de shell safe_move.sh :

#!/usr/bin/env bash
SRC_FILE_AND_PATH="$1"
SRC_BASENAME='basename "$1"'
DESTINATION_PATH="/mnt/tmp"

cp -a ${SRC_FILE_AND_PATH} ${DESTINATION_PATH}/${SRC_BASENAME}
rm -f ${SRC_FILE_AND_PATH}
cp -a ${DESTINATION_PATH}/${SRC_BASENAME} ${SRC_FILE_AND_PATH}
rm -f ${DESTINATION_PATH}/${SRC_BASENAME}

E isso será chamado com:

find /path/to/move -type f -exec safe_move.sh {} \;

Quaisquer pensamentos ou correções?

  • Eu encontrei um problema onde isso ALTER pasta datas devido a modificação dos filhos da pasta ... hrm. Não sei como superar isso ainda.
por ylluminate 28.04.2012 / 07:50

3 respostas

0

Descobri que o rsync finalmente faz o truque muito bem, exceto que você tem que remover as pastas que o processo deixa para trás. Infelizmente, mas como as pastas consomem muito pouco espaço, é insignificante e a rm é aceitável:

rsync -axvES --remove-source-files src_folder /dst_folder/ 
rsync -axvES --remove-source-files /old_dst_folder ./
    
por 07.05.2012 / 08:28
1

Considere o uso de tar com -p ( --preserve ). Dessa forma, você também tem um bom tarball para manter em torno de ... você sabe ... apenas no caso. Não há metadados que eu saiba que seriam deixados para trás. Eu também não me responsabilizo por nenhuma responsabilidade se for considerado errado. =)

EDIT: as datas de ligação simbólica não serão preservadas! Veja?! Nunca confie em um gato com privilégios de root.

Outras opções incluem cplv , mas você não tem um grupo de volumes com pelo menos o tamanho da fonte. cpdup também. Se estiver tudo no mesmo grupo de volumes, rsync pode ser uma opção.

    
por 28.04.2012 / 07:58
1

Notei que você marcou isso com a tag do FreeBSD. Se o FreeBSD é o seu sistema operacional, então

dump -0 -f /path/to/destination/file /what/to/dump

Os outros comandos que você precisará são

newfs /dev/ada0p1
mount /dev/ada0p1 /mnt
cd /mnt
restore -r -f /path/to/destination/file

Você deseja substituir esses nós de dispositivo por aqueles adequados ao seu sistema. Além disso, você quer ficar jogando partições inteiras e evitando jogar partes de uma partição.

    
por 29.04.2012 / 08:40