Como mover um arquivo sem preservar permissões

42

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

mv: falha ao preservar a propriedade de `/home/blah/backup/pgsql.tar.gz ': operação não permitida

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

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

Nux
fonte
Isso acontece também no dispositivo NTFS conectado, mas esse não é o único caso. Isso acontece em todos os casos em que você não tem direitos para alterar permissões ou não é possível (como no NTFS).
Nux
Isso é útil ao tentar mover arquivos que de alguma forma não são movidos devido a erros de permissão (por exemplo, porque eles são montados sobre cifs).
Sridhar Sarnobat

Respostas:

56

mvé a ferramenta errada para este trabalho; você quer cpe então rm. Como você está movendo o arquivo para outro sistema de arquivos, é exatamente isso que mvestá acontecendo nos bastidores, exceto que mvtambém está tentando preservar os bits de permissão do arquivo e as informações do proprietário / grupo. Isso ocorre porque mvpreservaria essas informações se estivesse movendo um arquivo no mesmo sistema de arquivos e mvtentasse se comportar da mesma maneira nas duas 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=modee em rmvez disso.

Kyle Jones
fonte
5
Obrigado, funciona. Acabou fazendo:, cp --no-preserve=mode,ownership $backupfile $destinationverifique o código de saída e faça rm $backupfilese estiver tudo bem.
Nux
22

Quando você move um arquivo dentro do mesmo sistema de arquivos, mvdesanexa 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, mvcopia o arquivo, tenta replicar o máximo de metadados possível 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). A hora da modificação do arquivo não é preservada. Com o GNUcp , você pode usar a --preserve=…opção para controlar quais metadados são replicados mais finamente, por exemplo --preserve=mode,timestamps.

Você também pode usar rsynce dizer o que deseja preservar. A opção -asignifica "preservar a maioria dos metadados", que inclui o proprietário se estiver sendo executado apenas como raiz.

rsync -a --no-owner --no-group --remove-source-files "$backupfile" "$destination"
Gilles 'SO- parar de ser mau'
fonte
A rsyncsolução funciona de forma excelente. Eu estava lutando para tentar transferir minha antiga instalação do ubuntu do compartilhamento CIFS. Meu rsync não relatou uma falha ao mover o arquivo, mas não o moveu e apenas relatou problemas de permissão.
Sridhar Sarnobat
+1 para rsyncsolução!
MikeSchinkel #