Como mover um arquivo sem preservar permissões

35

O problema é que eu quero ver erros ao mover um arquivo, mas não vejo erros com problema de permissão. Em outras palavras - eu me importo se o arquivo não é totalmente transmitido, mas não quero ver erros como este:

mv: failed to preserve ownership for '/home/blah/backup/pgsql.tar.gz': Operation not permitted

Então eu quero algo como: mv $backupfile $destination --ignore-permissions .

O arquivo de backup pode ser qualquer coisa de 1 MiB a 5 GiB e é transferido através do NFS.

    
por Nux 20.05.2014 / 21:27

2 respostas

45

mv é a ferramenta errada para este trabalho; você quer cp e, em seguida, rm . Como você está movendo o arquivo para outro sistema de arquivos, é exatamente isso que o mv está fazendo nos bastidores, exceto que mv também está tentando preservar os bits de permissão de arquivo e as informações de proprietário / grupo. Isso ocorre porque mv preservaria essa informação se estivesse movendo um arquivo dentro do mesmo sistema de arquivos e mv tentasse se comportar da mesma maneira em ambas as situações. Como você não se importa com a preservação de bits de permissão de arquivo e informações de proprietário / grupo, não use essa ferramenta. Use cp --no-preserve=mode e rm .

    
por 20.05.2014 / 21:34
18

Quando você move um arquivo dentro do mesmo sistema de arquivos, mv desanexa o arquivo do local antigo e o anexa ao novo local; metadados como permissões permanecem os mesmos. Quando você move um arquivo para um sistema de arquivos diferente, mv copia o arquivo, tenta replicar o máximo possível de metadados e remove o original.

Como você está migrando para um sistema de arquivos diferente e não deseja replicar muitos metadados, copie o arquivo e remova o original.

cp "$backupfile" "$destination" && rm "$backupfile"

Isso preserva as permissões do arquivo até certo ponto (por exemplo, legibilidade do mundo, executabilidade). O tempo de modificação do arquivo não é preservado. Com GNU cp , você pode usar a opção --preserve=… para contol quais metadados são replicados mais finamente, por exemplo --preserve=mode,timestamps .

Você também pode usar rsync e informar o que deseja preservar. A opção -a significa "preservar a maioria dos metadados", o que inclui o proprietário se for executado apenas como raiz.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
    
por 21.05.2014 / 09:10

Tags