¿Cómo puedo eliminar archivos de Time Machine usando la línea de comandos?

68

Quiero eliminar algunos archivos / directorios de mi partición de Time Machine usando rm , pero no puedo hacerlo. Estoy bastante seguro de que el problema está relacionado con algún tipo de atributos extendidos de control de acceso en los archivos de la copia de seguridad, pero no sé cómo anularlos / deshabilitarlos para que rm funcione. Un ejemplo del error que obtengo es:

% 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

Hay varias razones por las que no quiero usar la GUI de Time Machine o Finder para esto. Si es posible, me gustaría poder mantener la protección extendida para todos los demás archivos (me gustaría no deshabilitarlos globalmente, a menos que pueda volver a habilitarlos una vez que haya hecho mi trabajo).

Tim
fuente
Me he acercado. Primero, necesitaba deshabilitar las ACL en mi disco de Time Machine. Anteriormente, uno usaría fsaclctl para hacer esto, pero Snow Leopard no incluye esto. Tomé una copia del binario de una versión anterior de OSX y ejecuté esto:% sudo fsaclctl -p / Volumes / tmvol -d Luego intenté usar "sudo rm -rf" para eliminar un directorio, pero aún encontré problemas con algunos archivos (aunque otros se fueron bien). Específicamente, falló en enlaces blandos. Muy extraño. En el lado positivo, los enlaces casi no ocupan espacio. En el lado negativo, todavía tengo los directorios pegados.
Tim
Parece que la respuesta aceptada es bastante peligrosa al eliminar instantáneas, o carpetas en instantáneas, como su rm -r Backups.backupdb/MacBook/Latest/MacBook/somedir; Si está de acuerdo, ¿acepta la respuesta de Arne?
Arjan

Respuestas:

115

Para evitar los errores de "operación no permitida", use el programa "desviación" de Time Machine Safety Net :

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

En 10.8 Mountain Lion, el bypass se movió a 'Helpers':

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

En 10.10 Yosemite, el bypass se movió aquí:

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

Tenga cuidado al usar esto para eliminar instantáneas específicas: como Time Machine usa enlaces duros, el uso rm -ren carpetas también puede afectar las instantáneas más antiguas y más nuevas de la misma máquina . (Consulte otras respuestas relacionadas tmutil deletecon la eliminación segura de una instantánea específica) . Sin embargo, está bien usar rmpara eliminar todas las instantáneas de una sola máquina. Y también lo está usando rmpara eliminar un archivo específico, que solo eliminará ese archivo vinculado de las instantáneas que especifique, suponiendo que el archivo no esté en un directorio vinculado, ya que realmente eliminaría el archivo de todos esos directorios vinculados.

Eric W
fuente
+1 !! Esto me ayudo. Ni siquiera probé los otros porque parecía "la forma correcta" y, de hecho, me permitió resolver el problema sin más preguntas. ¡Gracias!
tripleee
Creé una cuenta solo para hacer +1 en ti. He estado buscando una mejor solución para esto, y esto fue todo. Me había estado volviendo loco. Gracias.
CWSpear
3
Increíble. Esto funciona. (aunque omito la opción 'v' para evitar ver una entrada para cada uno de los cientos de miles de archivos), es decir:sudo ...bypass rm -rf /Volumes/...
Brent Faust
66
Este es un método extremadamente peligroso para administrar archivos de Time Machine; Time Machine utiliza directorios vinculados para hacer referencia a carpetas que no han cambiado desde la copia de seguridad anterior, sin embargo, el rmproceso no los comprende y seguirá estos enlaces y eliminará archivos de ellos. Esto significa que podría eliminar archivos que también están en copias de seguridad más antiguas y más nuevas que la que seleccionó, lo que podría causar daños irreparables a las copias de seguridad. La recomendación de Arne Stenström de usar tmutiles, con mucho, la solución superior.
Haravikk
1
Para ampliar un poco el comentario de Haravikk: está bien usar archivosrm vinculados , pero no para carpetas vinculadas . La respuesta de Kent menciona el mismo problema. ¿Y en Cuál es el comando Unix para crear un enlace duro a un directorio en OS X? alguien escribió para 10.5 en 2010: "Eliminar es una historia diferente: si lo hace de la forma habitual para eliminar directorios, eliminará el contenido. Por lo tanto, debe" desvincular "el directorio: ". Por lo tanto, solo use esto para eliminar todas las copias de seguridad (instantáneas) de una máquina determinada. unlink new_hard_link
Arjan
26

BLUF (línea inferior al frente):

sudo tmutil delete snapshot-dir


El uso para eliminar todas las ACL de una jerarquía de carpetas no funciona en los archivos y carpetas en las copias de seguridad de Time Machine. Backupdb , debido al mecanismo TM Safety Net y los criterios descritos en esta publicación del 318 Tech Journal (pero posiblemente no exactamente como se describe) .     (Antes de aprender esto al buscar la red de seguridad mencionada en la respuesta de Eric W (que funciona), solo había probado en una carpeta clonada de una subcarpeta de una copia de seguridad de TM, y allí funcionó chmod . Pero probé chmod en una carpeta en una carpeta real La copia de seguridad de TM genera el error "Operación no permitida").sudo chmod -R -N folder

De posible uso:
    en Mac OS 10.7+, hay un comando tmutil (que no he probado, ya que todavía estoy en Snow Leopard). Tiene un verbo eliminar , que de acuerdo con la descripción "puede eliminar instantáneas de las copias de seguridad que no fueron realizadas o no fueron reclamadas por la máquina actual" (donde una "instantánea" es una carpeta con fecha que representa una única copia de seguridad incremental). No me queda claro si esto significa que no se puede eliminar instantáneas, que están hechas por oa reclamados por la máquina actual. (?)

Arne Stenström
fuente
2
De hecho, tmutil es útil y le permitirá eliminar copias de seguridad ( tmutil delete /Volumes/DISK/Backups.backupdb/HOST/DATE_FOLDER). Sin embargo, aún necesita el truco de omisión de Eric para eliminar la carpeta "Backups.backupdb".
mivk
Mi OSX 10.8.3 (Mountain Lion) no requirió bypass. Justo sudo tmutil delete <snapshot-dir>. La bypass rmrespuesta popular está desactualizada.
John Mee
¿Es posible usar tmutilpara eliminar solo algunos archivos de una instantánea? No funcionó para mí ( Invalid deletion target (error 22)), así que fui con él bypass.
RTS - lea sobre Monica Cellio el
+1 para BLUF. ¿Obtuviste eso de (el totalmente increíble) Manager-Tools? :)
Olie
Además: sigo encontrando referencias a un Backups.backupdbdirectorio que no veo en mi unidad de respaldo (una Time Capsule). Solo tengo cosas de la forma MachineName.sparsebundle. ¿Ha cambiado el formato? Estoy tratando de usar el comando de copia de seguridad de eliminación de TM, pero ha estado atascado en la barra de progreso del 99.99% durante varias horas.
Olie
12

Una advertencia sobre el uso del bypasscomando para eliminar una copia de seguridad anterior: si la copia de seguridad eliminada tiene carpetas que son exactamente iguales en copias de seguridad anteriores o posteriores, ¡entonces los archivos también pueden eliminarse de copias de seguridad anteriores o posteriores !

Time Machine no solo usa enlaces duros para archivos sin cambios, sino que también usa enlaces duros para carpetas en las que no se agregaron, cambiaron ni eliminaron archivos. Esto resulta en 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/

Con lo anterior, eliminar cualquier archivo /2014-11-06/folder/está bien y solo afecta la copia de seguridad para esa fecha. Los recuentos de referencia del enlace rígido se reducen, por lo que se eliminará el " inodo " para file2, pero los inodos para file1y file3todavía tendrán un recuento de referencia de 1 debido a las copias de seguridad posteriores. Por lo tanto, también rm -R /2014-11-06está bien.

Sin embargo, eliminar cualquier archivo de cualquiera de ellos /2014-11-13/folder/, /2014-11-20/folder/o /2014-11-27/folder/lo eliminará efectivamente de todas esas 3 carpetas.

El problema es que rm -Rno le importan las carpetas vinculadas. Simplemente vuelve a aparecer en cualquier carpeta vinculada que encuentre, elimina audazmente todos sus archivos y luego elimina la carpeta vacía.

Por lo tanto: al eliminar una copia de seguridad anterior, una no debe repetirse en una carpeta vinculada y eliminar su contenido. En cambio, uno solo debe eliminar el enlace duro para la carpeta en sí . Entonces, en lugar de rm -Rusar tmutil deletecomo se explica en la respuesta de Arne .

Por otro lado, parece que el unlinkcomando OS X no se puede usar en carpetas : "solo se puede proporcionar un argumento, que no debe ser un directorio" . La API de OS X puede eliminar carpetas vinculadas, al igual que GNU Coreutils , como las instaladas con Homebrew .

Finalmente, para probar todo lo anterior, un caso de prueba (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

Tenga en cuenta que el número de enlaces para cada aparición es 2 (segunda columna). Eliminemos la primera aparición:

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

Entonces, después de desvincular uno de los archivos, el número de enlaces se redujo a 1 para cada aparición, aunque el archivo todavía se muestra 3 veces. No hay problemas todavía. Elimine la primera aparición nuevamente:

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

Ahora todos se han ido. Aparentemente, el archivo TopSites.plistse modificó por última vez el 2014-11-06 y se vinculó el 2014-11-13, ya que luego se agregaron, cambiaron o eliminaron otros archivos en la Safaricarpeta. A continuación, el contenido de la Safaricarpeta no cambió en las dos copias de seguridad posteriores, por lo que el 20 de noviembre de 2014 y el 27 de noviembre de 2014 la Safaricarpeta estaba vinculada a la copia de seguridad anterior.

De hecho, las 4 carpetas solo usan 2 inodes (primera columna):

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//
Kent
fuente
1
Algunos antecedentes: para archivos , los enlaces duros funcionan como se esperaba; solo se elimina el enlace duro que desea eliminar. Me gusta: touch file1; ln file1 file2; ln file2 file3; ls -li; rm file2; ls -lisolo eliminará un solo enlace duro. Pero para las carpetas , en ¿Cuál es el comando Unix para crear un enlace duro a un directorio en OS X? alguien escribió para 10.5 en 2010: "Eliminar es una historia diferente: si lo hace de la forma habitual para eliminar directorios, eliminará el contenido. Por lo tanto, debe " desvincular "el directorio: unlink new_hard_link". Esto probablemente todavía sea válido.
Arjan
La página del manual para unlink(en 10.6.8) dice que no se puede utilizar en los directorios: When the utility is called as unlink, only one argument, which must not be a directory, may be supplied.
Kent
Mmmm, misterio. Aún más, su respuesta es importante: no la use [bypass] rm -ren directorios vinculados. (Pero no tengo que explicártelo).
Arjan
Acabo de experimentar un poco más. Correr bypass unlink FILEtiene la misma consecuencia (¿no intencionada?) Como bypass rm FILE. El ARCHIVO idéntico se elimina de todas las copias de seguridad, no solo de la ubicación especificada. Y, unlinkNO tomará un directorio o más de un archivo como argumento (servidor 10.6.8; pero, no creo que esto haya cambiado a través de las versiones más nuevas del sistema operativo)
Kent
Wow, estoy bastante sorprendido por tu bypass rm FILEy bypass unlink FILEeliminar todos los archivos idénticos, que no coinciden con lo que uno ve touch file1; ln file1 file2; ln file2 file3; ls -li; unlink file2; ls -li, ni para touch file1; ln file1 file2; ln file2 file3; ls -li; /System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass unlink file2; ls -li. Nunca voy a eliminar algo de una copia de seguridad ...
Arjan
3

Nota: Debido a la "Red de seguridad TM" mencionada por Eric W, esta respuesta no funciona para el caso de una copia de seguridad de Time Machine, a la que se refiere específicamente la pregunta. Pero para la mayoría de los demás casos, la información sobre cómo deshacerse de las ACL es relevante.


No es necesario usar herramientas ACL copiadas de un sistema operativo anterior.

Use ls -lepara ver las ACL y chmodmodificarlas.

Para obtener más información, escriba man chmody busque en "Opciones de manipulación de ACL".

El comando para eliminar todas las ACL de una jerarquía de carpetas es:

chmod -R -N foldername
RAM
fuente
2

La máquina del tiempo funciona como rshapshot. Crea un árbol de enlaces duros para cada nueva copia de seguridad. Los enlaces duros a archivos que ya existían en una copia de seguridad anterior usan muy poco espacio adicional. Solo cuando se elimina el último enlace duro a un archivo, el archivo se elimina realmente del sistema de archivos.

Eliminar una copia de seguridad individual completa no hará daño. Solo estás eliminando enlaces duros. Ninguna otra copia de seguridad se verá afectada. Pero eso se puede lograr a través de tmutil.

Un escenario en el que puede ser necesario omitir la protección es eliminar un archivo específico de todas las copias de seguridad (y la razón por la que terminé en esta publicación).

Mi disco de respaldo está lleno. Tengo un archivo muy grande (muchos gigabytes) que ha sido respaldado por meses. Hay una copia física, pero muchas instantáneas con enlaces duros a esa copia. Para deshacerme de ese archivo, necesito eliminar el enlace duro de cada copia de seguridad.

Tenga en cuenta que el número de inodo es el mismo para todos los enlaces duros al mismo archivo.

% 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

(Lo último es solo un enlace simbólico al último directorio con fecha)

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

El archivo se elimina de todas las copias de seguridad y se devuelve el espacio. Si el archivo ha cambiado con el tiempo, cada copia de seguridad tendrá una copia completa y el espacio devuelto será enorme.

Brusco
fuente
En cuanto a "Eliminar una copia de seguridad individual completa no hará daño. Simplemente está eliminando enlaces duros. Ninguna otra copia de seguridad se verá afectada". : si esto se refiere a instantáneas dentro de las copias de seguridad para una sola máquina, la respuesta dada de Kent (antigua) usando rm -rpodría ser (o: haber sido) peligrosa. Es mejor prevenir que curar y usar tmutilpara eso.
Arjan
0

Si no está ejecutando el comando como el usuario que "posee" la copia de seguridad, tendrá dificultades para eliminar de la línea de comando. Acabo de tener este problema con una migración, y tuvimos que cambiar a la copia de seguridad completa de Time Machine (1 tb +) y formatear la unidad antes de poder acceder a ella, y confía en mí, intenté todo para anular los permisos.

Nic
fuente
2
sudo debería darme acceso a todos los archivos ya que me estoy ejecutando como administrador. Estoy bastante seguro de que este es un problema de ACL y estoy trabajando en eso.
Tim
1
Nic, unos años tarde, pero en caso de que te lo hayas perdido: mira la respuesta de Eric .
Arjan
@Tim: esta afirmación incluso sería falsa en otros sistemas unixoides, dado el atributo inmutable ( chattr). En teoría, lo que te dará Root es eludir cualquier red de seguridad.
0xC0000022L
0

Si desea eliminar todos los archivos de una carpeta y no solo archivos específicos, puede hacerlo agregando la carpeta a la lista de exclusión de Time Machine. (Preferencias del sistema -> Time Machine -> Opciones. Arrastre la carpeta aquí.)

La próxima vez que realice una copia de seguridad, las copias de esa carpeta se eliminarán de las copias de seguridad anteriores.

Ahora, si realmente quieres hacer esto desde una CLI, hay una manera, aunque un poco engorrosa.

  1. Haga una copia de seguridad de /Library/Preferences/com.apple.TimeMachine.plist
  2. Copie /Library/Preferences/com.apple.TimeMachine.plist en algún lugar donde pueda jugar con él.
  3. CD en donde lo pones.
  4. Ejecute
    plutil -convert xml1 com.apple.TimeMachine.plist
    para convertirlo de forma binaria.
  5. Abra el plist convertido en el editor de texto preferible, busque "skippaths"
  6. Inserte una nueva línea en esa sección, formateada como <string>/Path/To/Exclude</string>
  7. Guardar y salir, convertir de nuevo ejecutando
    plutil -convert binary1 com.apple.TimeMachine.plist
  8. Copie su plist editado nuevamente en / Library / Preferences /
  9. Inicie una copia de seguridad ejecutando
    /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto

Editar: cuando realice el paso 9, todas las copias de la carpeta recién excluida se borrarán de las copias de seguridad anteriores.

Para eliminar la excepción, copie su copia de seguridad nuevamente en / Biblioteca / Preferencias.

escarcha
fuente
No estoy tratando de excluir un directorio. Estoy tratando de eliminar un directorio de una copia de seguridad existente y hacer algo desde la línea de comandos. Realmente, me gustaría descubrir cómo permitir que rm funcione dentro de un directorio Backups.backupdb.
Tim
OK, tal vez no estaba claro en mis instrucciones que la carpeta realmente se elimina de las copias de seguridad al realizar los pasos anteriores. Mira mi edición. Pero si no es la solución que está buscando, supongo que siempre podría hacerlo su - rooty luego rm -rflas carpetas, pero creo que jugar con algo tan valioso como las copias de seguridad de esa manera es algo que generalmente se debe tratar de evitar.
Frost
Pero agregarlo como una exclusión eliminaría todas las copias de todas las copias de seguridad. Además, aunque esta es una copia de seguridad de TimeMachine, no es desde la máquina en la que estoy haciendo este trabajo, por lo que ya no es una TimeMachine activa. sudo tiene el mismo efecto que "su - root" y luego "rm -rf". Estoy bastante seguro de que esto está fallando porque Apple ha agregado un nivel de seguridad al sistema de archivos más allá de los permisos simples * nix.
Tim
Esto puede sonar estúpido, pero no estoy completamente seguro de que sudotenga el mismo efecto que su - rooten una Mac. Me parece recordar una ocasión en la que estaba tratando de eliminar algo que sudono era suficiente, pero sudo - rootfuncionó.
Frost
3
@ Frost: no creo que Time Machine funcione de la manera que sugieres. Solo intenté excluir una carpeta, luego ejecuté TM, y las copias de seguridad más antiguas de esa carpeta todavía están presentes en TM. O tal vez su comportamiento ha cambiado desde que publicó esto hace casi un año.
Cafeína Coma
0

Puede hacer una lslista de atributos extendidos en una vista larga usando la -@bandera. Enumerará las ACL cuando proporcione la -ebandera. Por lo tanto, puede averiguar con qué está tratando utilizando ls -lea@ DIR.

A juzgar por mis copias de seguridad locales de Time Machine, parece que Time Machine aplica atributos extendidos con metadatos sobre las instantáneas más nuevas y antiguas. Los datos almacenados por xattrs parecen ser una lista binaria. Estos parecen inocuos.

Time Machine también busca aplicar ACL a ciertos directorios que conoce, como los ubicados en un directorio de usuario estándar. Hay dos tipos de ACL que pueden interponerse en su camino: las que se aplican directamente al archivo o directorio que niegan la eliminación y las que se aplican a un padre del archivo que niega delete_child.

Desafortunadamente, Mac OS X no proporciona las utilidades de usuario getfacly lo setfaclespecifica POSIX.2c para ver y manipular las ACL. Para meterse con las ACL, tendrá que hacer algo de programación; ver la página de acl(3)manual.

Jeremy W. Sherman
fuente