Como posso excluir arquivos do Time Machine usando a linha de comando

61

Eu quero excluir alguns arquivos / diretórios da minha Partição do Time Machine usando rm , mas não consigo fazê-lo. Tenho certeza de que o problema está relacionado a algum tipo de atributos estendidos de controle de acesso em arquivos no backup, mas não sei como substituí-los / desativá-los para que o 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

Existem vários motivos pelos quais não desejo usar a GUI ou o Finder do Time Machine para isso. Se possível, gostaria de poder manter a proteção estendida para todos os outros arquivos (eu gostaria de não desativá-los globalmente, a menos que eu possa reativar assim que eu fizer meu trabalho).

    
por Tim 12.07.2010 / 17:50

8 respostas

107

Para contornar erros de "operação não permitida", use o Rede de Segurança da Time Machine " bypass "do programa:

sudo /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass rm -rfv /Volumes/[disk]/Backups.backupdb/[path]

No 10.8 Mountain Lion, o desvio foi movido para 'Assistentes':

/System/Library/Extensions/TMSafetyNet.kext/Helpers/bypass

Em 10.10 Yosemite, o desvio foi movido para cá:

/System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass

Cuidado ao usar isso para excluir instantâneos específicos: como o Time Machine usa links físicos, usando rm -r em pastas também pode afetar instantâneos antigos e mais recentes da mesma máquina . (Veja outras respostas referindo-se a tmutil delete para excluir com segurança um instantâneo específico.) O uso de rm para excluir os todos instantâneos de uma única máquina está bom. E também está usando rm para excluir um arquivo específico, que removerá apenas o arquivo com link físico do (s) instantâneo (s) especificado (s), supondo que o arquivo não esteja em um diretório com link de hardware. arquivo de todos esses diretórios com hard-link.

    
por 08.02.2012 / 14:46
25

BLUF (linha de baixo inicial):

sudo tmutil delete snapshot-dir

Usar sudo chmod -R -N folder para remover todas as ACLs de uma hierarquia de pastas não funciona nos arquivos e pastas do Backups.backupdb do Time Machine, devido a a TM Safety Net mecanismo e os critérios descritos neste 318 Tech Journal post (mas possivelmente não exatamente como descrito).
(Antes de aprender isso ao procurar a Rede de Segurança mencionada na resposta de Eric W (que funciona), eu tinha testado apenas em uma pasta clonada de uma subpasta de um backup do TM, e o chmod funcionava. chmod em uma pasta em um backup TM real dá o erro "Operação não permitida".

De possível uso:
No Mac OS 10.7+, há uma tmutil (que eu não tentei, pois ainda estou no Snow Leopard). Ele tem um verbo delete , que de acordo com a descrição "pode excluir snapshots 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 não é possível excluir os instantâneos que são feitos ou reivindicados pela máquina atual. (?)

    
por 23.11.2011 / 01:50
9

Um aviso sobre o uso do comando bypass para remover um backup antigo: se o backup excluído tiver pastas exatamente iguais em backups anteriores ou posteriores, os arquivos também poderão ser excluídos de backups anteriores ou posteriores !

O Time Machine não usa apenas hard links para arquivos inalterados, mas também usa hard links para pastas nas quais nenhum arquivo foi adicionado, alterado ou excluído. Isso resulta em algo como:

/2014-11-06/folder/file1
                  /file2
                  /file3
/2014-11-13/folder/file1 = hard link to file /2014-11-06/folder/file1
                  /file2 (changed; new inode)
                  /file3 = hard link to file /2014-11-06/folder/file3
/2014-11-20/folder/ = hard link to folder /2014-11-13/folder/
/2014-11-27/folder/ = hard link to folder /2014-11-20/folder/

Com o acima, excluir qualquer arquivo de /2014-11-06/folder/ é bom e afeta somente o backup para essa data. As contagens de referência do link físico são reduzidas, então o " inode " para file2 será removido, mas inodes para file1 e file3 ainda terão uma contagem de referência de 1 devido aos backups posteriores. Portanto, rm -R /2014-11-06 também é bom.

No entanto, a remoção de qualquer arquivo de /2014-11-13/folder/ , /2014-11-20/folder/ ou /2014-11-27/folder/ o removerá efetivamente de todas essas três pastas.

O problema é que rm -R não se importa com pastas com link físico. Ele apenas recursiva em qualquer pasta com link físico encontrado, exclui com coragem todos os seus arquivos e, em seguida, remove a pasta vazia.

Portanto: ao remover um backup antigo, não é necessário recorrer a uma pasta com link físico e excluir seu conteúdo. Em vez disso, deve-se apenas remover o link físico para a própria pasta . Então, ao invés de rm -R use tmutil delete como explicado na resposta do Arne .

Como um aparte, parece que o comando OS X unlink 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 com link físico, e assim pode GNU Coreutils , como instalado usando Homebrew .

Finalmente, para provar todos os itens acima, um caso de teste (OSX 10.6.8):

sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-06-012454/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-20-014044/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 2 USERNAME  staff  1551 10 30  2014 2014-11-27-025033/Users/USERNAME/Library/Safari/TopSites.plist

Observe que o número de links para cada ocorrência é 2 (segunda coluna). Vamos remover a primeira ocorrência:

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-06-012454/Users/USERNAME/Library/Safari/TopSites.plist 
sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-20-014044/Users/USERNAME/Library/Safari/TopSites.plist
-rw-r--r--@ 1 USERNAME  staff  1551 10 30  2014 2014-11-27-025033/Users/USERNAME/Library/Safari/TopSites.plist

Então, 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. Nenhum problema ainda. Remova a primeira ocorrência novamente:

sh-3.2# /System/Library/Extensions/TMSafetyNet.kext/Contents/MacOS/bypass unlink 2014-11-13-024438/Users/USERNAME/Library/Safari/TopSites.plist 
sh-3.2# ls -lFa 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist 
ls: 2014-11*/Users/USERNAME/Library/Safari/TopSites.plist: No such file or directory

Agora todos se foram. Aparentemente, o arquivo TopSites.plist foi alterado pela última vez em 2014-11-06 e com hard-link em 2014-11-13, quando alguns outros arquivos foram adicionados, alterados ou removidos na pasta Safari . Em seguida, o conteúdo da pasta Safari não foi alterado nos dois backups subsequentes, portanto, em 2014-11-20 e 2014-11-27, a pasta Safari foi vinculada ao backup anterior.

De fato, as 4 pastas usam apenas 2 inodes (primeira coluna):

sh-3.2# ls -lFaid 2014-11*/Users/USERNAME/Library/Safari/
648651968 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:06 2014-11-06-012454/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-13-024438/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-20-014044/Users/USERNAME/Library/Safari//
650804457 drwxr-xr-x@ 86 USERNAME  staff  2924  9 10 16:07 2014-11-27-025033/Users/USERNAME/Library/Safari//
    
por 26.02.2013 / 03:53
3

Nota: Devido à "TM Safety Net" mencionada por Eric W, esta resposta não funciona para o caso de um backup do Time Machine, ao qual a questão se refere especificamente. Mas para a maioria dos outros casos, as informações sobre como se livrar das ACLs são relevantes.

Não há necessidade de usar as ferramentas de ACL copiadas de um sistema operacional antigo.

Use ls -le para ver as ACLs e chmod para alterá-las.

Para 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 é:

chmod -R -N foldername
    
por 07.09.2011 / 00:59
0

Se você não estiver executando o comando como o usuário que "possui" o backup, será difícil excluir a linha de comando. Acabei de ter esse problema com uma migração e tivemos que copiar todo o backup do Time Machine (1tb +) e formatar o disco antes que pudéssemos ter acesso a ele - e, confie em mim, tentei de tudo para substituir as permissões. / p>     

por 13.07.2010 / 06:17
0

Se você deseja excluir todos os arquivos de uma pasta e não apenas arquivos específicos, pode fazê-lo adicionando a pasta à lista de exclusão do Time Machine. (Preferências do sistema - > Time Machine - > Opções. Arraste a pasta aqui.)

Na próxima vez que você realizar um backup, as cópias dessa pasta serão removidas dos backups anteriores.

Agora, se você realmente quiser fazer isso de uma CLI, há um jeito, ainda que um pouco complicado.

  1. Faça um backup de /Library/Preferences/com.apple.TimeMachine.plist
  2. Copie /Library/Preferences/com.apple.TimeMachine.plist em algum lugar onde você possa brincar com ele.
  3. Cd em qualquer lugar que você coloque.
  4. Execute o% plutil -convert xml1 com.apple.TimeMachine.plist para convertê-lo da forma binária.
  5. Abra o plist convertido no editor de texto preferencial, pesquise por "skippaths"
  6. Insira uma nova linha nessa seção, formatada como <string>/Path/To/Exclude</string>
  7. Salve e saia, converta de volta executando plutil -convert binary1 com.apple.TimeMachine.plist
  8. Copie sua lista editada de volta para / Library / Preferences /
  9. Iniciar um backup executando o% /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto

Editar: Quando você 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 de volta para / Library / Preferences.

    
por 12.07.2010 / 21:24
0

Você pode tornar os atributos estendidos da lista ls em uma exibição longa usando o sinalizador -@ . Ele listará as ACLs quando você fornecer o sinalizador -e . Então, você pode descobrir com o que está lidando usando ls -lea@ DIR .

A julgar pelos meus backups locais do Time Machine, parece que o Time Machine aplica atributos estendidos com metadados sobre os instantâneos mais recentes e mais antigos. Os dados armazenados pelo xattrs parecem ser um plist binário. Estes parecem inócuos.

O Time Machine também procura aplicar ACLs a determinados diretórios que conhece, como aqueles colocados em um diretório de usuário padrão. Existem dois tipos de ACLs que podem estar em seu caminho: as aplicadas diretamente ao arquivo ou diretório que negam a exclusão e as aplicadas a um pai do arquivo que nega delete_child.

Infelizmente, o Mac OS X não fornece os utilitários de usuário getfacl e setfacl especificados pelo POSIX.2c para visualizar e manipular as ACLs. Para mexer com ACLs, você terá que fazer alguma programação; veja a% man_de% manpage.

    
por 17.11.2010 / 23:42
0

A máquina do tempo funciona como o rshapshot. Cria uma árvore de links rígidos para cada novo backup. 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 vai doer. Você está apenas removendo links rígidos. Nenhum outro backup será afetado. Mas isso pode ser feito 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 acabei nesta postagem).

Meu disco de backup está cheio. Eu tenho um arquivo muito grande (muitos gigabytes) que foi feito o backup por meses. Há uma cópia física dele, mas muitos instantâneos com links para essa cópia. Para me livrar desse arquivo, preciso remover o link físico de todos os backups.

Observe que o número do inode é o mesmo para todos os links físicos para o mesmo arquivo.

% cd /Volumes/WD\ 500G\ USB/Backups.backupdb/csm-laptop
% ls -li */Macintosh\ HD/Users/csm/vm.img
...
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-005636/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-015812/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-030036/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 2015-05-08-041307/Macintosh HD/Users/csm/vm.img
2740350 -rw-r--r--@ 28 csm  staff  42949672960 Feb 17 16:12 Latest/Macintosh HD/Users/csm/vm.img

(Mais recente é apenas um link simbólico para o último diretório datado)

% sudo bypass rm -f */Macintosh\ HD\Users\csm\vm.img

O arquivo é removido de todos os backups e o espaço é retornado. Se o arquivo foi mudando ao longo do tempo, cada backup terá uma cópia completa e o espaço retornado será enorme.

    
por 08.05.2015 / 19:16