Come posso eliminare i file di Time Machine usando la riga di comando


68

Voglio eliminare alcuni file / directory dalla mia partizione di Time Machine usando rm , ma non riesco a farlo. Sono abbastanza sicuro che il problema sia legato ad una sorta di controllo esteso degli attributi estesi sui file nel backup, ma non so come sovrascriverli / disabilitarli per far funzionare rm . Un esempio dell'errore che sto riscontrando è:

% 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

Esistono diversi motivi per cui non voglio utilizzare la GUI di Time Machine o il Finder per questo. Se possibile, vorrei essere in grado di mantenere la protezione estesa per tutti gli altri file (non vorrei disabilitarli a livello globale, a meno che non possa riattivare una volta che ho fatto il mio lavoro).


Mi sono avvicinato. Innanzitutto, avevo bisogno di disabilitare gli ACL sul mio disco di Time Machine. In precedenza, si utilizza fsaclctl per farlo, ma Snow Leopard non lo include. Ho preso una copia del file binario da una versione precedente di OSX ed ho eseguito questo:% sudo fsaclctl -p / Volumes / tmvol -d Ho quindi provato a usare "sudo rm -rf" per rimuovere una directory, ma continuavo a riscontrare problemi con alcuni file (anche se altri sono andati bene). In particolare, non è riuscito sui collegamenti software. Molto strano. Tra i lati positivi, i collegamenti non occupano quasi spazio. Sul lato negativo, ho ancora le directory in giro.
Tim

Sembra che la risposta accettata sia abbastanza pericolosa quando si eliminano istantanee o cartelle in istantanee, come la tua rm -r Backups.backupdb/MacBook/Latest/MacBook/somedir; se sei d'accordo, per favore accetta la risposta di Arne?
Arjan,

Risposte:


115

Per aggirare gli errori "operazione non consentita", utilizzare il programma "bypass" della Time Machine Safety Net :

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

In 10.8 Mountain Lion, il bypass si è spostato in "Helpers":

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

In 10.10 Yosemite, il bypass si è spostato qui:

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

Fai attenzione quando lo usi per eliminare specifiche istantanee: poiché Time Machine utilizza collegamenti fissi, l'utilizzo rm -rsu cartelle potrebbe influire anche sulle istantanee più vecchie e più recenti della stessa macchina . (Vedi altre risposte a cui fare riferimento per tmutil deleteeliminare in modo sicuro un'istantanea specifica.) L'uso rmdi eliminare tutte le istantanee per un singolo computer è comunque corretto. E quindi sta usando rmper eliminare un file specifico, che rimuoverà solo quel file hard-link dall'istantanea / e che specifichi, supponendo che il file non sia in una directory hard-link in quanto rimuoveresti effettivamente il file da tutti quelle directory hard-linkate.


+1 !! Questo mi ha aiutato. Non ho nemmeno provato gli altri perché questo sembrava "il modo giusto" e in effetti, mi ha permesso di risolvere il problema senza ulteriori domande. Grazie!
tripla,

Ho creato un account solo per farti +1. Ho cercato una soluzione migliore a questo, e questo è stato. Mi stava facendo impazzire. Grazie.
CWSpear

3
Eccezionale. Questo funziona (anche se lascio fuori l'opzione 'v' per evitare di vedere una voce per ciascuna delle poche centinaia di migliaia di file) cioè:sudo ...bypass rm -rf /Volumes/...
Brent Faust,

6
Questo è un metodo estremamente pericoloso per la gestione dei file di Time Machine; Time Machine utilizza directory hard-link per fare riferimento a cartelle che non sono cambiate rispetto al backup precedente, tuttavia il rmprocesso non le comprende e seguirà questi collegamenti e rimuoverà i file da essi. Ciò significa che è possibile eliminare potenzialmente i file che si trovano anche in backup più vecchi e più recenti di quello selezionato, causando potenzialmente danni irreparabili ai backup. La raccomandazione di Arne Stenström di utilizzare tmutilè di gran lunga la soluzione superiore.
Haravikk,

1
Per estendere un po 'il commento di Haravikk: l'uso rmper i file con collegamenti fissi va bene, ma per le cartelle con collegamenti fissi non lo è. La risposta di Kent menziona lo stesso problema. E in Qual è il comando Unix per creare un collegamento fisico a una directory in OS X? qualcuno ha scritto per la 10.5 nel 2010: "L'eliminazione è una storia diversa: se lo fai nel solito modo per eliminare le directory, eliminerai il contenuto. Quindi devi" scollegare "la directory: unlink new_hard_link". Quindi utilizzalo solo per eliminare tutti i backup (istantanee) per un determinato computer.
Arjan,

26

BLUF (linea di fondo in alto):

sudo tmutil delete snapshot-dir


Utilizzando per rimuovere tutti gli ACL da una gerarchia di cartelle non funziona su file e cartelle in di Time Machine Backups.backupdb , a causa della la TM Safety Net meccanismo ed i criteri descritti in questo 318 Tech ufficiale postale (ma forse non esattamente come descritto) .     (Prima di imparare questo guardando la Safety Net menzionata nella risposta di Eric W (che funziona), avevo testato solo su una cartella clonata da una sottocartella di un backup TM, e lì chmod funzionava. Ma provare chmod su una cartella in un vero e proprio Il backup TM fornisce l'errore "Operazione non consentita".)sudo chmod -R -N folder

Di possibile utilizzo:
    in Mac OS 10.7+, c'è un comando tmutil (che non ho provato, dato che sono ancora su Snow Leopard). Ha un verbo di eliminazione , che secondo la descrizione "può eliminare le istantanee dai backup che non sono stati creati o non rivendicati dalla macchina corrente" (dove uno "snapshot" è una cartella datata che rappresenta un singolo backup incrementale). Non mi è chiaro se questo significa che non è possibile eliminare le istantanee che sono fatti da o rivendicati dalla macchina corrente. (?)


2
Infatti, tmutil è utile e ti consentirà di eliminare i backup ( tmutil delete /Volumes/DISK/Backups.backupdb/HOST/DATE_FOLDER). Tuttavia, è ancora necessario il trucco di bypass di Eric per eliminare la cartella "Backups.backupdb" stessa.
marzo

Il mio OSX 10.8.3 (Mountain Lion) non ha richiesto il bypass. Basta sudo tmutil delete <snapshot-dir>. La bypass rmrisposta popolare è obsoleta.
John Mee,

È possibile utilizzare tmutilper eliminare solo alcuni file da un'istantanea? Non ha funzionato per me ( Invalid deletion target (error 22)) quindi sono andato con bypass.
RTS - leggi Monica Cellio il

+1 per BLUF. L'hai preso da (il fantastico strumento) Manager-Tools? :)
Olie il

Inoltre: continuo a trovare riferimenti a una Backups.backupdbdirectory che non vedo sul mio disco di backup (Time Capsule). Ho solo cose del modulo MachineName.sparsebundle. Il formato è cambiato? Sto cercando di utilizzare il comando di backup di eliminazione di TM, ma è stato bloccato sulla barra di avanzamento del 99,99% per diverse ore.
Olie,

12

Un avvertimento sull'uso del bypasscomando per rimuovere un vecchio backup: se il backup eliminato ha cartelle esattamente uguali nei backup precedenti o successivi, i file potrebbero essere eliminati anche dai backup precedenti o successivi !

Time Machine non solo utilizza hard link per file invariati, ma utilizza anche hard link per cartelle in cui non sono stati aggiunti, modificati o eliminati file. Ciò si traduce in qualcosa di simile:

/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/

Con quanto sopra, l'eliminazione di qualsiasi file /2014-11-06/folder/va bene e influisce solo sul backup per quella data. I conteggi dei riferimenti del collegamento reale vengono ridotti, quindi " inode " per file2verrà rimosso, ma gli inode per file1e file3avranno ancora un conteggio di riferimento di 1 a causa dei backup successivi. Quindi rm -R /2014-11-06va bene lo stesso.

Tuttavia, la rimozione di qualsiasi file da entrambi /2014-11-13/folder/, /2014-11-20/folder/o /2014-11-27/folder/in modo efficace e elimina da tutti quei 3 cartelle.

Il problema è che rm -Rnon interessa le cartelle hard-linkate. Reclama semplicemente in qualsiasi cartella hard-link trovata, elimina audacemente tutti i suoi file e quindi rimuove la cartella vuota.

Quindi: quando si rimuove un vecchio backup, non è necessario ricorrere in una cartella con collegamenti fisici ed eliminarne il contenuto. Invece, si dovrebbe rimuovere solo il collegamento reale per la cartella stessa . Quindi, piuttosto che rm -Rusare tmutil deletecome spiegato nella risposta di Arne .

A parte questo, sembra che il unlinkcomando OS X non possa essere usato su cartelle : "può essere fornito solo un argomento, che non deve essere una directory" . L'API di OS X può rimuovere le cartelle hard-linkate, così come GNU Coreutils , come installato usando Homebrew .

Infine, per dimostrare quanto sopra, un test-case (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

Si noti che il numero di collegamenti per ogni occorrenza è 2 (seconda colonna). Rimuoviamo la prima occorrenza:

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

Quindi, dopo aver scollegato uno dei file, il numero di collegamenti è sceso a 1 per ogni occorrenza, sebbene il file sia ancora mostrato 3 volte. Nessun problema ancora. Rimuovere di nuovo la prima occorrenza:

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

Ora sono andati tutti. Apparentemente, il file è TopSites.pliststato modificato l'ultima volta il 06/11/2014 e hard-link il 13-11-2014, poiché alcuni altri file sono stati aggiunti, modificati o rimossi nella Safaricartella. Successivamente, il contenuto della Safaricartella non è cambiato nei due backup successivi, quindi il 20-11-2014 e il 27-11-2014 la Safaricartella era strettamente collegata al backup precedente.

In effetti, le 4 cartelle usano solo 2 inode (prima colonna):

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//

1
Alcuni retroscena: per i file , i collegamenti fisici funzionano come previsto; viene rimosso solo il collegamento reale che si desidera eliminare. Come: touch file1; ln file1 file2; ln file2 file3; ls -li; rm file2; ls -lirimuoverà solo un singolo hard link. Ma per le cartelle , in Qual è il comando Unix per creare un collegamento fisico a una directory in OS X? qualcuno ha scritto per la 10.5 nel 2010: "L'eliminazione è una storia diversa: se lo fai nel solito modo per eliminare le directory, eliminerai il contenuto. Quindi devi " scollegare "la directory: unlink new_hard_link". Questo è probabilmente ancora valido.
Arjan,

La pagina man per unlink(in 10.6.8) dice che non può essere utilizzato su directory: When the utility is called as unlink, only one argument, which must not be a directory, may be supplied.
Kent,

Hmmm, mistero. Ancora di più, la tua risposta è importante: non utilizzare [bypass] rm -rsu directory hard-linkate. (Ma non devo spiegartelo.)
Arjan,

Ho appena sperimentato un po 'di più. Esecuzione bypass unlink FILEha lo stesso effetto (non intenzionale?) Come bypass rm FILE. Il FILE identico viene rimosso da tutti i backup, non solo dalla singola posizione specificata. E unlinkNON prenderà una directory o più di un file come argomento (server 10.6.8; ma, non credo che questo sarà cambiato con le versioni più recenti del sistema operativo)
Kent

Wow, sono abbastanza sorpreso dal tuo bypass rm FILEe dalla bypass unlink FILErimozione di tutti i file identici, che non corrispondono a ciò che si vede per touch file1; ln file1 file2; ln file2 file3; ls -li; unlink file2; ls -li, né per touch file1; ln file1 file2; ln file2 file3; ls -li; /System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass unlink file2; ls -li. Non rimuoverò mai qualcosa da un backup ...
Arjan,

3

Nota: a causa della "TM Safety Net" menzionata da Eric W, questa risposta non funziona nel caso di un backup di Time Machine, a cui la domanda appartiene specificamente. Ma per quasi tutti gli altri casi, le informazioni su come sbarazzarsi degli ACL sono rilevanti.


Non è necessario utilizzare gli strumenti ACL copiati da un sistema operativo precedente.

Utilizzare ls -leper visualizzare gli ACL e chmodper modificarli.

Per ulteriori informazioni, digitare man chmode cercare in "Opzioni di manipolazione ACL".

Il comando per rimuovere tutti gli ACL da una gerarchia di cartelle è:

chmod -R -N foldername

2

La macchina del tempo funziona come rshapshot. Crea un albero di collegamenti reali per ogni nuovo backup. I collegamenti reali ai file già esistenti in un backup precedente utilizzano pochissimo spazio aggiuntivo. Solo quando l'ultimo collegamento reale a un file viene rimosso, il file viene effettivamente eliminato dal filesystem.

La rimozione di un intero backup individuale non farà male. Stai solo rimuovendo i collegamenti reali. Nessun altro backup sarà interessato. Ma ciò può essere realizzato tramite tmutil.

Uno scenario in cui potrebbe essere necessario bypassare la protezione è rimuovere un file specifico da tutti i backup (e il motivo per cui sono finito su questo post).

Il mio disco di backup è pieno. Ho un file molto grande (molti gigabyte) di cui è stato eseguito il backup per mesi. Ne esiste una copia fisica, ma molte istantanee con collegamenti reali a quella copia. Per eliminare effettivamente quel file, devo rimuovere il collegamento reale da ogni backup.

Si noti che il numero di inode è lo stesso per tutti gli hard link allo stesso file.

% 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

(L'ultimo è solo un link simbolico all'ultima directory datata)

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

Il file viene rimosso da tutti i backup e viene restituito spazio. Se il file è cambiato nel tempo, ogni backup avrà una copia completa e lo spazio restituito sarà enorme.


Per quanto riguarda "La rimozione di un intero backup individuale non farà male. Stai solo rimuovendo i collegamenti reali. Nessun altro backup ne sarà interessato." : se questo si riferisce alle istantanee all'interno dei backup per una singola macchina, dato che la (vecchia) risposta di Kent usando rm -rpotrebbe essere (o: essere) stata pericolosa. Meglio essere sicuri che dispiaciuti e usare tmutilper quello.
Arjan,

0

Se non si esegue il comando come utente "proprietario" del backup, sarà difficile eliminare dalla riga di comando. Ho appena avuto questo problema con una migrazione e abbiamo dovuto idem per l'intero backup di Time Machine (1 TB +) e formattare l'unità prima di poter ottenere qualsiasi tipo di accesso ad esso - e, credetemi, ho provato di tutto per sovrascrivere le autorizzazioni.


2
sudo dovrebbe darmi accesso a tutti i file mentre sono in esecuzione come amministratore. Sono abbastanza sicuro che si tratti di un problema ACL e ci sto lavorando.
Tim

1
Nic, qualche anno in ritardo, ma nel caso in cui te lo sei perso: vedi la risposta di Eric .
Arjan,

@Tim: questa affermazione sarebbe persino falsa su altri sistemi unixoid, dato l'attributo immutabile ( chattr). Quale radice ti fornirà teoricamente di eludere qualsiasi rete di sicurezza.
0xC0000022L

0

Se desideri eliminare tutti i file in una cartella e non solo file specifici, puoi farlo aggiungendo la cartella all'elenco di esclusioni di Time Machine. (Preferenze di Sistema -> Time Machine -> Opzioni. Trascina qui la cartella.)

La prossima volta che si esegue un backup, le copie di quella cartella verranno rimosse dai backup precedenti.

Ora, se vuoi davvero farlo da una CLI, c'è un modo, anche se un po 'ingombrante.

  1. Eseguire un backup di /Library/Preferences/com.apple.TimeMachine.plist
  2. Copia /Library/Preferences/com.apple.TimeMachine.plist da qualche parte dove puoi giocare con esso.
  3. Cd ovunque tu lo metta.
  4. Eseguire
    plutil -convert xml1 com.apple.TimeMachine.plist
    per convertirlo dal modulo binario.
  5. Apri il plist convertito nell'editor di testo preferibile, cerca "skippaths"
  6. Inserisci una nuova riga in quella sezione, formattata come <string>/Path/To/Exclude</string>
  7. Salvare ed uscire, riconvertire eseguendo
    plutil -convert binary1 com.apple.TimeMachine.plist
  8. Copia il tuo plist modificato di nuovo in / Libreria / Preferenze /
  9. Avviare un backup eseguendo
    /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto

Modifica: quando si esegue il passaggio 9, tutte le copie della cartella appena esclusa verranno cancellate dai backup precedenti.

Per rimuovere l'eccezione, copiare nuovamente il backup in / Libreria / Preferenze.


Non sto cercando di escludere una directory. Sto cercando di eliminare una directory da un backup esistente e di eseguirne alcuni dalla riga di comando. Davvero, vorrei solo capire come consentire a rm di funzionare all'interno di una directory Backups.backupdb.
Tim

OK, forse non è chiaro dalle mie istruzioni che la cartella viene effettivamente eliminata dai backup quando si eseguono i passaggi precedenti. Vedi la mia modifica. Ma se non è la soluzione che stai cercando, suppongo che potresti sempre su - roote poi rm -rfle cartelle, ma penso che armeggiare con qualcosa di prezioso come i backup in quel modo sia qualcosa che dovresti generalmente cercare di evitare.
Frost,

Ma aggiungerlo come esclusione eliminerebbe tutte le copie di esso da tutti i backup. Inoltre, sebbene questo sia un backup di TimeMachine, non proviene dalla macchina su cui sto facendo questo lavoro, quindi non è più un TimeMachine attivo. sudo ha lo stesso effetto di "su - root" e quindi di "rm -rf". Sono abbastanza sicuro che questo non stia funzionando perché Apple ha aggiunto un livello di sicurezza al filesystem oltre le semplici autorizzazioni * nix.
Tim

Potrebbe sembrare stupido, ma non sono del tutto sicuro che sudoabbia lo stesso effetto di su - rootun Mac. Mi sembra di ricordare un'occasione in cui stavo cercando di eliminare qualcosa in cui sudonon era sufficiente, ma sudo - rootha funzionato.
Frost,

3
@ Frost- Non credo che Time Machine funzioni come suggerisci. Ho appena provato ad escludere una cartella, quindi eseguire TM, e i backup più vecchi di quella cartella sono ancora presenti in TM. O forse il suo comportamento è cambiato da quando l'hai pubblicato quasi un anno fa.
Caffeina Coma,

0

È possibile creare un lselenco di attributi estesi in una vista lunga utilizzando il -@flag. Elencherà gli ACL quando si fornisce la -ebandiera. Quindi, puoi scoprire con cosa hai a che fare utilizzando ls -lea@ DIR.

A giudicare dai backup locali di Time Machine, sembra che Time Machine applichi attributi estesi con metadati sulle istantanee più recenti e meno recenti. I dati memorizzati da xattrs sembrano essere un plist binario. Questi sembrano innocui.

Time Machine cerca anche di applicare ACL a determinate directory di cui è a conoscenza, come quelle inserite in una directory utente standard. Esistono due tipi di ACL che potrebbero essere sulla tua strada: quelli applicati direttamente al file o alla directory che negano l'eliminazione e quelli applicati a un genitore del file che nega delete_child.

Sfortunatamente, Mac OS X non fornisce i programmi di utilità dell'utente getfacle setfaclspecificati da POSIX.2c per visualizzare e manipolare gli ACL. Per scherzare con gli ACL, dovrai fare un po 'di programmazione; vedi la acl(3)manpage.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.