Desejo excluir alguns arquivos / diretórios da minha Time Machine Partition usando rm , mas não consigo fazer isso. Tenho certeza de que o problema está relacionado a algum tipo de atributo estendido do controle de acesso nos arquivos do backup, mas não sei como substituí-los / desativá-los para que a rm funcione. Um exemplo do erro que estou recebendo é:
% sudo rm -rf Backups.backupdb/MacBook/Latest/MacBook/somedir
rm: Backups.backupdb/MacBook/Latest/MacBook/somedir: Directory not empty
rm: Backups.backupdb/MacBook/Latest/MacBook/somedir/somefile: Operation not permitted
Há várias razões pelas quais não quero usar a GUI do Time Machine ou o Finder para isso. Se possível, eu gostaria de poder manter a proteção estendida para todos os outros arquivos (gostaria de não desabilitá-los globalmente, a menos que eu possa reativá-lo depois de concluir meu trabalho).
rm -r Backups.backupdb/MacBook/Latest/MacBook/somedir
; se você concorda, por favor aceite a resposta de Arne?Respostas:
Para contornar erros de "operação não permitida", use o programa "ignorar" da Time Machine Safety Net :
Em 10.8 Mountain Lion, o desvio passou para 'Helpers':
Em 10.10 Yosemite, o desvio passou para aqui:
Cuidado ao usar isso para excluir instantâneos específicos: como o Time Machine usa links físicos, o uso
rm -r
em pastas também pode afetar os instantâneos mais antigos e mais recentes da mesma máquina . (Consulte outras respostas referentes àtmutil delete
exclusão segura de um instantâneo específico.) No entanto, usarrm
para excluir todos os instantâneos de uma única máquina. E o mesmo ocorre comrm
a exclusão de um arquivo específico, que removerá apenas o arquivo vinculado do snapshot (s) especificado (s), assumindo que o arquivo não esteja em um diretório vinculado, pois você removeria o arquivo de todos os esses diretórios vinculados.fonte
sudo ...bypass rm -rf /Volumes/...
rm
processo não as entende e seguirá esses links e removerá os arquivos deles. Isso significa que você pode excluir arquivos que também estão em backups mais antigos e mais recentes que o selecionado, causando danos irreparáveis aos backups. A recomendação de Arne Stenström de usartmutil
é de longe a solução superior.rm
para arquivos com links físicos é bom, mas para pastas com links físicos não é. A resposta de Kent menciona o mesmo problema. E em Qual é o comando Unix para criar um hardlink para um diretório no OS X? alguém escreveu para a versão 10.5 em 2010: "Excluir é uma história diferente: se você seguir a maneira usual de excluir diretórios, excluirá o conteúdo. Portanto, você deve" desvincular "o diretório:unlink new_hard_link
". Portanto, use isso apenas para excluir todos os backups (instantâneos) de uma determinada máquina.BLUF (linha inferior na frente):
Usar para remover todas as ACLs de uma hierarquia de pastas não funciona nos arquivos e pastas no Backups.backupdb do Time Machine , devido ao mecanismo da TM Safety Net e aos critérios descritos nesta publicação do 318 Tech Journal (mas possivelmente não exatamente como descrito) . (Antes de aprender isso pesquisando a rede de segurança mencionada na resposta de Eric W (que funciona), eu só havia testado em uma pasta clonada em uma subpasta de um backup da TM, e o chmod funcionou. Mas tentar o chmod em uma pasta O backup da TM apresenta o erro "Operação não permitida".)
sudo chmod -R -N folder
De uso possível:
no Mac OS 10.7+, existe um comando tmutil (que eu não tentei, pois ainda estou no Snow Leopard). Possui um verbo de exclusão , que de acordo com a descrição "pode excluir instantâneos de backups que não foram feitos ou não são reivindicados pela máquina atual" (onde um "instantâneo" é uma pasta datada que representa um único backup incremental). Não está claro para mim se isso significa que ele não pode excluir instantâneos que são feitas por ou reivindicados pela máquina atual. (?)
fonte
tmutil delete /Volumes/DISK/Backups.backupdb/HOST/DATE_FOLDER
). No entanto, você ainda precisa do truque de desvio de Eric para excluir a própria pasta "Backups.backupdb".sudo tmutil delete <snapshot-dir>
. Abypass rm
resposta popular está desatualizada.tmutil
para excluir apenas alguns arquivos de um instantâneo? Não funcionou para mim (Invalid deletion target (error 22)
), então fui combypass
ele.Backups.backupdb
diretório que não estou vendo na minha unidade de backup (um Time Capsule). Eu só tenho coisas da formaMachineName.sparsebundle
. O formato mudou? Estou tentando usar o comando delete backup da TM, mas ele ficou preso na barra de progresso de 99,99% por várias horas.Um aviso sobre o uso do
bypass
comando para remover um backup antigo: se o backup excluído tiver pastas exatamente iguais nos backups anteriores ou posteriores, os arquivos também poderão ser excluídos dos backups anteriores ou posteriores !O Time Machine não apenas usa links físicos para arquivos inalterados, mas também usa links físicos para pastas nas quais nenhum arquivo foi adicionado, alterado ou excluído. Isso resulta em algo como:
Com o exposto acima, a exclusão de qualquer arquivo de
/2014-11-06/folder/
está correta e afeta apenas o backup para essa data. As contagens de referência do hard link são diminuídas, portanto, o " inode " parafile2
será removido, mas os inodesfile1
efile3
ainda terão uma contagem de referência 1 devido aos backups posteriores. Portanto,rm -R /2014-11-06
está bem também.No entanto, remover qualquer arquivo de qualquer um
/2014-11-13/folder/
,/2014-11-20/folder/
ou/2014-11-27/folder/
irá efetivamente removê-lo de todas as 3 pastas.O problema é que
rm -R
não se preocupa com pastas vinculadas. Ele apenas se repete em qualquer pasta com vínculo físico que encontra, exclui com ousadia todos os seus arquivos e remove a pasta vazia.Portanto: ao remover um backup antigo, não se deve recursar para uma pasta vinculada e excluir seu conteúdo. Em vez disso, deve-se remover apenas o link físico da própria pasta . Então, ao invés de
rm -R
usartmutil delete
como explicado na resposta de Arne .Como um aparte, parece que o
unlink
comando do OS X não pode ser usado em pastas : "apenas um argumento, que não deve ser um diretório, pode ser fornecido" . A API do OS X pode remover pastas vinculadas, assim como o GNU Coreutils , como instalado usando o Homebrew .Por fim, para provar todas as opções acima, um caso de teste (OSX 10.6.8):
Observe que o número de links para cada ocorrência é 2 (segunda coluna). Vamos remover a primeira ocorrência:
Portanto, depois de desvincular um dos arquivos, o número de links caiu para 1 para cada ocorrência, embora o arquivo ainda seja mostrado 3 vezes. Ainda não há problemas. Remova a primeira ocorrência novamente:
Agora tudo se foi. Aparentemente, o arquivo
TopSites.plist
foi alterado pela última vez em 11/11/2014 e vinculado permanentemente em 13/11/2014, já que outros arquivos foram adicionados, alterados ou removidos naSafari
pasta. Em seguida, o conteúdo daSafari
pasta não foi alterado nos dois backups subsequentes; portanto, em 20/11/2014 e 27/11/2014, aSafari
pasta estava vinculada ao backup anterior.De fato, as 4 pastas usam apenas 2 inodes (primeira coluna):
fonte
touch file1; ln file1 file2; ln file2 file3; ls -li; rm file2; ls -li
removerá apenas um único link físico. Mas para pastas , em Qual é o comando Unix para criar um hardlink para um diretório no OS X? alguém escreveu para a versão 10.5 em 2010: "Excluir é uma história diferente: se você seguir a maneira usual de excluir diretórios, excluirá o conteúdo. Portanto, você deve " desvincular "o diretório:unlink new_hard_link
". Provavelmente isso ainda é válido.unlink
(em 10.6.8) diz que não pode ser usado em diretórios:When the utility is called as unlink, only one argument, which must not be a directory, may be supplied
.[bypass] rm -r
em diretórios vinculados. (Mas eu não tenho que explicar isso para você.)bypass unlink FILE
tem a mesma consequência (não intencional?) Quebypass rm FILE
. O ARQUIVO idêntico é removido de todos os backups, não apenas do único local especificado. E,unlink
não vai demorar um diretório ou mais de um arquivo como um argumento (10.6.8 servidor, mas, eu não acho que isso terá mudado através das versões mais recentes do sistema operacional)bypass rm FILE
e com abypass unlink FILE
remoção de todos os arquivos idênticos, o que não corresponde ao que se vêtouch file1; ln file1 file2; ln file2 file3; ls -li; unlink file2; ls -li
nem paratouch file1; ln file1 file2; ln file2 file3; ls -li; /System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass unlink file2; ls -li
. Eu nunca estou indo para remover algo de um backup ...Nota: Devido à "TM Safety Net" mencionada por Eric W, esta resposta não funciona no caso de um backup do Time Machine, ao qual a pergunta se refere especificamente. Mas para quase todos os outros casos, as informações sobre como se livrar das ACLs são relevantes.
Não há necessidade de usar ferramentas ACL copiadas de um sistema operacional mais antigo.
Use
ls -le
para visualizar ACLs echmod
alterá-las.Para obter mais informações, digite
man chmod
e procure em "Opções de manipulação da ACL".O comando para remover todas as ACLs de uma hierarquia de pastas é:
fonte
A máquina do tempo funciona como rshapshot. Ele cria uma árvore de links físicos para cada novo backup. Os links físicos para arquivos já existentes em um backup anterior usam muito pouco espaço adicional. Somente quando o último link físico para um arquivo é removido, o arquivo é realmente excluído do sistema de arquivos.
Remover um backup individual inteiro não será prejudicial. Você está apenas removendo links físicos. Nenhum outro backup será afetado. Mas isso pode ser realizado via tmutil.
Um cenário em que pode ser necessário ignorar a proteção é remover um arquivo específico de todos os backups (e o motivo pelo qual eu acabei nesta postagem).
Meu disco de backup está cheio. Eu tenho um arquivo muito grande (muitos gigabytes) com backup por meses. Há uma cópia física dela, mas muitos instantâneos com links físicos para essa cópia. Para realmente me livrar desse arquivo, preciso remover o link físico de cada backup.
Observe que o número do inode é o mesmo para todos os links físicos para o mesmo arquivo.
(O mais recente é apenas um link simbólico para o último diretório datado)
O arquivo é removido de todos os backups e o espaço é retornado. Se o arquivo estiver mudando com o tempo, cada backup terá uma cópia completa e o espaço retornado será enorme.
fonte
rm -r
pode ser (ou: foi) perigosa. É melhor prevenir do que remediar e usartmutil
para isso.Se você não estiver executando o comando como o usuário "proprietário" do backup, será difícil excluir a linha de comando. Acabei de ter esse problema com a migração e tivemos que escolher o backup completo do Time Machine (1 TB +) e formatar a unidade antes que pudéssemos obter qualquer tipo de acesso a ela - e, confie em mim, tentei de tudo para substituir as permissões.
fonte
chattr
). O que a raiz fornecerá teoricamente é contornar qualquer rede de segurança.Se você deseja excluir todos os arquivos em uma pasta e não apenas arquivos específicos, é possível fazer isso adicionando a pasta à lista de exclusão do Time Machine. (Preferências do sistema -> Time Machine -> Opções. Arraste a pasta para cá.)
Na próxima vez que você fizer um backup, as cópias dessa pasta serão removidas dos backups anteriores.
Agora, se você realmente deseja fazer isso a partir de uma CLI, há uma maneira, embora um pouco complicada.
plutil -convert xml1 com.apple.TimeMachine.plist
para convertê-lo de forma binária.
<string>/Path/To/Exclude</string>
plutil -convert binary1 com.apple.TimeMachine.plist
/System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto
Editar: Ao executar a etapa 9, todas as cópias da pasta recém-excluída serão apagadas dos backups anteriores.
Para remover a exceção, copie seu backup novamente em / Library / Preferences.
fonte
su - root
e depoisrm -rf
as pastas, mas acho que mexer em algo tão precioso quanto os backups dessa maneira é algo que geralmente se deve evitar.sudo
tenha o mesmo efeito quesu - root
em um Mac. Parece que me lembro de uma ocasião em que estava tentando excluir algo quesudo
não era suficiente, massudo - root
fiz o truque.Você pode fazer a
ls
lista de atributos estendidos em uma visão longa usando o-@
sinalizador. Ele listará ACLs quando você fornecer o-e
sinalizador. Então, você pode descobrir com o que está lidando usandols -lea@ DIR
.A julgar pelos backups locais do Time Machine, parece que o Time Machine aplica atributos estendidos com metadados sobre os instantâneos mais novos e mais antigos. Os dados armazenados pelo xattrs parecem ser uma lista binária. Estes parecem inócuos.
O Time Machine também procura aplicar ACLs a determinados diretórios que ele conhece, como aqueles colocados em um diretório de usuário padrão. Existem dois tipos de ACLs que podem estar em seu caminho: os aplicados diretamente ao arquivo ou diretório que negam a exclusão e os aplicados a um pai do arquivo que nega o delete_child.
Infelizmente, o Mac OS X não fornecer os utilitários de usuário
getfacl
esetfacl
especificado pelo POSIX.2c para visualizar e manipular ACLs. Para mexer com ACLs, você terá que fazer alguma programação; veja a página deacl(3)
manual.fonte