Como excluir arquivos do Time Machine usando a linha de comando


68

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).


Eu cheguei mais perto. Primeiro, eu precisava desativar as ACLs no meu disco do Time Machine. Anteriormente, usava-se fsaclctl para fazer isso, mas o Snow Leopard não inclui isso. Peguei uma cópia do binário de uma versão mais antiga do OSX e executei o seguinte:% sudo fsaclctl -p / Volumes / tmvol -d Tentei usar o "sudo rm -rf" para remover um diretório, mas ainda encontrava problemas com alguns arquivos (embora outros tenham desaparecido). Especificamente, falhou em links flexíveis. Muito estranho. No lado positivo, os links ocupam quase nenhum espaço. No lado negativo, eu ainda tenho os diretórios por aí.
Tim

Parece que a resposta aceita é bastante perigosa ao excluir snapshots ou pastas em snapshots, como o seu rm -r Backups.backupdb/MacBook/Latest/MacBook/somedir; se você concorda, por favor aceite a resposta de Arne?
Arjan

Respostas:


115

Para contornar erros de "operação não permitida", use o programa "ignorar" da Time Machine Safety Net :

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

Em 10.8 Mountain Lion, o desvio passou para 'Helpers':

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

Em 10.10 Yosemite, o desvio passou para aqui:

/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, o uso rm -rem pastas também pode afetar os instantâneos mais antigos e mais recentes da mesma máquina . (Consulte outras respostas referentes à tmutil deleteexclusão segura de um instantâneo específico.) No entanto, usar rmpara excluir todos os instantâneos de uma única máquina. E o mesmo ocorre com rma 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.


+1 !! Isso me ajudou. Eu nem tentei os outros porque isso parecia "o caminho certo" e, de fato, me permitiu resolver o problema sem mais perguntas. Obrigado!
Tripleee

Criei uma conta apenas para marcar você com +1. Eu estava procurando uma solução melhor para isso, e foi isso. Isso estava me deixando louco. Obrigado.
CWpear

3
Impressionante. Isso funciona. (embora eu deixe de fora a opção 'v' para evitar ver uma entrada para cada uma das centenas de milhares de arquivos), ou seja:sudo ...bypass rm -rf /Volumes/...
Brent Faust

6
Este é um método extremamente perigoso para gerenciar arquivos do Time Machine; O Time Machine usa diretórios vinculados para fazer referência a pastas que não foram alteradas desde o backup anterior; no entanto, o rmprocesso 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 usar tmutilé de longe a solução superior.
Haravikk

11
Para estender um pouco o comentário de Haravikk: usar rmpara 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.
Arjan

26

BLUF (linha inferior na frente):

sudo tmutil delete snapshot-dir


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. (?)


2
De fato, o tmutil é útil e permitirá excluir backups ( 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".
mivk

Meu OSX 10.8.3 (Mountain Lion) não exigia desvio. Apenas sudo tmutil delete <snapshot-dir>. A bypass rmresposta popular está desatualizada.
9119 John Mee

É possível usar tmutilpara excluir apenas alguns arquivos de um instantâneo? Não funcionou para mim ( Invalid deletion target (error 22)), então fui com bypassele.
RTS - leia sobre Monica Cellio

+1 para BLUF. Você conseguiu isso das (totalmente incríveis) Ferramentas de Gerenciamento? :)
Olie

Além disso: eu continuo encontrando referências a um Backups.backupdbdiretório que não estou vendo na minha unidade de backup (um Time Capsule). Eu só tenho coisas da forma MachineName.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.
Olie

12

Um aviso sobre o uso do bypasscomando 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:

/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 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 " para file2será removido, mas os inodes file1e file3ainda terão uma contagem de referência 1 devido aos backups posteriores. Portanto, rm -R /2014-11-06está 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 -Rnã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 -Rusar tmutil deletecomo explicado na resposta de Arne .

Como um aparte, parece que o unlinkcomando 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):

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

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:

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 tudo se foi. Aparentemente, o arquivo TopSites.plistfoi alterado pela última vez em 11/11/2014 e vinculado permanentemente em 13/11/2014, já que outros arquivos foram adicionados, alterados ou removidos na Safaripasta. Em seguida, o conteúdo da Safaripasta não foi alterado nos dois backups subsequentes; portanto, em 20/11/2014 e 27/11/2014, a Safaripasta estava 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//

11
Alguns antecedentes: para arquivos , os links físicos funcionam como esperado; somente o link físico que você deseja excluir é removido. Como: touch file1; ln file1 file2; ln file2 file3; ls -li; rm file2; ls -liremoverá 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.
Arjan

A página man 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.
Kent

Hummm, mistério. Ainda mais, sua resposta é importante: não use [bypass] rm -rem diretórios vinculados. (Mas eu não tenho que explicar isso para você.)
Arjan

Eu apenas experimentei um pouco mais. Correr bypass unlink FILEtem a mesma consequência (não intencional?) Que bypass rm FILE. O ARQUIVO idêntico é removido de todos os backups, não apenas do único local especificado. E, unlinknã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)
Kent

Uau, estou bastante surpreso com você bypass rm FILEe com a bypass unlink FILEremoçã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 -linem para touch 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 ...
Arjan

3

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 -lepara visualizar ACLs e chmodalterá-las.

Para obter mais informações, digite man chmode 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

2

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.

% 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

(O 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 estiver mudando com o tempo, cada backup terá uma cópia completa e o espaço retornado será enorme.


Quanto a "Remover um backup individual inteiro não será prejudicial. Você está apenas removendo links físicos. Nenhum outro backup será afetado". : se isso se referir a instantâneos nos backups de uma única máquina, a resposta (antiga) de Kent, usando, rm -rpode ser (ou: foi) perigosa. É melhor prevenir do que remediar e usar tmutilpara isso.
Arjan

0

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.


2
O sudo deve me dar acesso a todos os arquivos enquanto eu estiver executando como administrador. Tenho certeza de que esse é um problema da ACL e estou trabalhando nisso.
Tim

11
Nic, alguns anos atrasado, mas caso você tenha perdido: veja a resposta de Eric .
Arjan

@ Tim: esta afirmação seria até falsa em outros sistemas unixóides, dado o atributo imutável ( chattr). O que a raiz fornecerá teoricamente é contornar qualquer rede de segurança.
0xC0000022L

0

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.

  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ê colocar.
  4. Execute
    plutil -convert xml1 com.apple.TimeMachine.plist
    para convertê-lo de forma binária.
  5. Abra o plist convertido no editor de texto preferencial, procure "skippaths"
  6. Insira uma nova linha nessa seção, formatada como <string>/Path/To/Exclude</string>
  7. Salve e saia, converta novamente executando
    plutil -convert binary1 com.apple.TimeMachine.plist
  8. Copie seu plist editado de volta para / Library / Preferences /
  9. Inicie um backup executando
    /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.


Não estou tentando excluir um diretório. Estou tentando excluir um diretório de um backup existente e fazer alguns na linha de comando. Realmente, eu gostaria de descobrir como permitir que a rm funcione dentro de um diretório Backups.backupdb.
Tim

OK, talvez não esteja claro nas minhas instruções que a pasta é realmente excluída dos backups ao executar as etapas acima. Veja minha edição. Mas se não é a solução que você está procurando, suponho que você possa sempre su - roote depois rm -rfas pastas, mas acho que mexer em algo tão precioso quanto os backups dessa maneira é algo que geralmente se deve evitar.
Geada

Mas adicioná-lo como uma exclusão excluiria todas as cópias dele de todos os backups. Além disso, embora seja um backup do TimeMachine, não é da máquina em que estou fazendo este trabalho, portanto, não é mais um TimeMachine ativo. sudo tem o mesmo efeito que "su - root" e depois "rm -rf". Tenho certeza de que isso está falhando porque a Apple adicionou um nível de segurança ao sistema de arquivos além das permissões simples * nix.
Tim

Isso pode parecer estúpido, mas não tenho certeza de que sudotenha o mesmo efeito que su - rootem um Mac. Parece que me lembro de uma ocasião em que estava tentando excluir algo que sudonão era suficiente, mas sudo - rootfiz o truque.
Geada

3
@ Frost- Eu não acho que o Time Machine funcione da maneira que você sugere. Tentei excluir uma pasta e depois executar o TM, e os backups mais antigos dessa pasta ainda estão presentes no TM. Ou talvez seu comportamento tenha mudado desde que você postou isso quase um ano atrás.
Cafeína Coma

0

Você pode fazer a lslista de atributos estendidos em uma visão longa usando o -@sinalizador. Ele listará ACLs quando você fornecer o -esinalizador. Então, você pode descobrir com o que está lidando usando ls -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 getfacle setfaclespecificado pelo POSIX.2c para visualizar e manipular ACLs. Para mexer com ACLs, você terá que fazer alguma programação; veja a página de acl(3)manual.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.