cp perdendo metadados do arquivo

6

Eu tenho um NAS da Asustor que roda no Linux; Eu não sei qual distro eles usam.

Consigo fazer login usando SSH e usar todos os comandos do Shell. Volume interno usa ext2 e HDs USB externos usam NTFS.

Quando tento usar o comando cp para copiar qualquer arquivo, os metadados de data desse arquivo são alterados para o datetime atual.

No exemplo, se eu uso o Windows para copiar o arquivo do SMB e o arquivo foi modificado em 2007, o novo arquivo é marcado como criado agora em 2017, mas modificado em 2007. Mas com o comando cp do Linux, a data da modificação é mudou para 2017 também.

Essa data modificada é muito relevante para mim porque permite classificar arquivos no Windows Explorer pela data de modificação. Se for sobrescrito, não consigo classificar e todos parecem ter sido criados agora. Eu também uso data modificada para saber quando eu adquiri alguns arquivos antigos raros.

Existe algum parâmetro que eu possa usar no comando cp para preservar os metadados originais do arquivo?

Atualização: tentei cp --preserve=timestamps , mas não funcionou, imprime:

cp: unrecognized option '--preserve=timestamps'
BusyBox v1.19.3 (2017-03-22 17:23:49 CST) multi-call binary.

Usage: cp [OPTIONS] SOURCE DEST

Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY

        -a      Same as -dpR
        -R,-r   Recurse
        -d,-P   Preserve symlinks (default if -R)
        -L      Follow all symlinks
        -H      Follow symlinks on command line
        -p      Preserve file attributes if possible
        -f      Overwrite
        -i      Prompt before overwrite
        -l,-s   Create (sym)links

Se eu tentar apenas -p , ele diz cp: can't preserve permissions of '...': Operation not permitted , mas, até onde eu testei, os timestamps estão sendo preservados.

    
por Hikari 06.11.2017 / 17:04

2 respostas

11

Se você usar man cp para ler a página de manual do comando copy, você encontrará as -p and --preserve flags.

-p same as --preserve=mode,ownership,timestamps

e

--preserve[=ATTR_LIST] preserve the specified attributes (default: mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all

O que isso significa é que você deve usar cp -p em vez de apenas cp .

    
por 06.11.2017 / 17:28
1

Acho que há algumas observações que merecem ser mencionadas.

Você diz que não tem certeza de qual distribuição está usando, mas em sua atualização você incluiu a saída que identificou sua distribuição como BusyBox v1.19.3. Observando o Guia do desenvolvedor do Asustor NAS confirma que o SO em questão é BusyBox .

A resposta postada por @roaima cita a página man do comando cp . Isso faz sentido em geral, mas talvez não neste caso.

BusyBox é um sistema operacional Linux minimalista projetado para dispositivos embarcados e é um ambiente um pouco diferente do que os sabores mais populares do Linux que a maioria das pessoas provavelmente está acostumada. Em particular, provavelmente não há páginas man em seu NAS e os comandos podem ter recursos, comportamento e sintaxe um pouco diferentes. Aqui está a documentação do BusyBox:

E aqui está a entrada para o comando cp no BusyBox:

cp

cp [OPTIONS] SOURCE DEST

Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY

Options:

        -a      Same as -dpR
        -d,-P   Preserve links
        -H,-L   Dereference all symlinks (default)
        -p      Preserve file attributes if possible
        -f      Force overwrite
        -i      Prompt before overwrite
        -R,-r   Recurse
        -l,-s   Create (sym)links

Podemos ver que o sinalizador da opção -p ainda está lá e tem a mesma semântica que normalmente, embora não tenha a sintaxe mais flexível disponível em distribuições com mais recursos:

--preserve[=ATTR_LIST]

Isso é consistente com a mensagem de uso que você obteve ao tentar executar o comando cp com o sinalizador --preserve .

Outra opção para tentar, já que você diz que o sinal -p não está funcionando, seria copiar o arquivo sem o sinalizador -p e depois usar o comando touch para atualizar o horário da modificação, por exemplo :

root@busybox:~# cp original_file new_file
root@busybox:~# touch -r original_file new_file

Se isso não funcionar, convém atualizar sua pergunta para incluir a mensagem de erro recebida. Talvez você também queira atualizar sua pergunta para incluir as propriedades dos arquivos que você está tentando copiar, os locais dos quais você está tentando copiá-los e o usuário que está executando, os comandos exatos que você está usando. re usando, e o usuário que você está logado como quando executando esses comandos.

Dito isso, suspeito que seu comando cp -p esteja gerando um erro relacionado a permissões porque você está copiando em volumes montados e o proprietário do arquivo existe em um volume, mas não em outro (ou algo semelhante a isso).

    
por 08.11.2017 / 04:46