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).
rm -r Backups.backupdb/MacBook/Latest/MacBook/somedir
; Si está de acuerdo, ¿acepta la respuesta de Arne?Respuestas:
Para evitar los errores de "operación no permitida", use el programa "desviación" de Time Machine Safety Net :
En 10.8 Mountain Lion, el bypass se movió a 'Helpers':
En 10.10 Yosemite, el bypass se movió aquí:
Tenga cuidado al usar esto para eliminar instantáneas específicas: como Time Machine usa enlaces duros, el uso
rm -r
en carpetas también puede afectar las instantáneas más antiguas y más nuevas de la misma máquina . (Consulte otras respuestas relacionadastmutil delete
con la eliminación segura de una instantánea específica) . Sin embargo, está bien usarrm
para eliminar todas las instantáneas de una sola máquina. Y también lo está usandorm
para 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.fuente
sudo ...bypass rm -rf /Volumes/...
rm
proceso 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 usartmutil
es, con mucho, la solución superior.rm
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
BLUF (línea inferior al frente):
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. (?)
fuente
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".sudo tmutil delete <snapshot-dir>
. Labypass rm
respuesta popular está desactualizada.tmutil
para eliminar solo algunos archivos de una instantánea? No funcionó para mí (Invalid deletion target (error 22)
), así que fui con élbypass
.Backups.backupdb
directorio que no veo en mi unidad de respaldo (una Time Capsule). Solo tengo cosas de la formaMachineName.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.Una advertencia sobre el uso del
bypass
comando 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:
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 " parafile2
, pero los inodos parafile1
yfile3
todavía tendrán un recuento de referencia de 1 debido a las copias de seguridad posteriores. Por lo tanto, tambiénrm -R /2014-11-06
está 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 -R
no 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 -R
usartmutil delete
como se explica en la respuesta de Arne .Por otro lado, parece que el
unlink
comando 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):
Tenga en cuenta que el número de enlaces para cada aparición es 2 (segunda columna). Eliminemos la primera aparición:
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:
Ahora todos se han ido. Aparentemente, el archivo
TopSites.plist
se 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 laSafari
carpeta. A continuación, el contenido de laSafari
carpeta 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 laSafari
carpeta estaba vinculada a la copia de seguridad anterior.De hecho, las 4 carpetas solo usan 2 inodes (primera columna):
fuente
touch file1; ln file1 file2; ln file2 file3; ls -li; rm file2; ls -li
solo 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.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
.[bypass] rm -r
en directorios vinculados. (Pero no tengo que explicártelo).bypass unlink FILE
tiene la misma consecuencia (¿no intencionada?) Comobypass rm FILE
. El ARCHIVO idéntico se elimina de todas las copias de seguridad, no solo de la ubicación especificada. Y,unlink
NO 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)bypass rm FILE
ybypass unlink FILE
eliminar todos los archivos idénticos, que no coinciden con lo que uno vetouch file1; ln file1 file2; ln file2 file3; ls -li; unlink file2; ls -li
, ni paratouch 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 ...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 -le
para ver las ACL ychmod
modificarlas.Para obtener más información, escriba
man chmod
y busque en "Opciones de manipulación de ACL".El comando para eliminar todas las ACL de una jerarquía de carpetas es:
fuente
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.
(Lo último es solo un enlace simbólico al último directorio con fecha)
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.
fuente
rm -r
podría ser (o: haber sido) peligrosa. Es mejor prevenir que curar y usartmutil
para eso.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.
fuente
chattr
). En teoría, lo que te dará Root es eludir cualquier red de seguridad.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.
plutil -convert xml1 com.apple.TimeMachine.plist
para convertirlo de forma binaria.
<string>/Path/To/Exclude</string>
plutil -convert binary1 com.apple.TimeMachine.plist
/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.
fuente
su - root
y luegorm -rf
las 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.sudo
tenga el mismo efecto quesu - root
en una Mac. Me parece recordar una ocasión en la que estaba tratando de eliminar algo quesudo
no era suficiente, perosudo - root
funcionó.Puede hacer una
ls
lista de atributos extendidos en una vista larga usando la-@
bandera. Enumerará las ACL cuando proporcione la-e
bandera. Por lo tanto, puede averiguar con qué está tratando utilizandols -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
getfacl
y losetfacl
especifica POSIX.2c para ver y manipular las ACL. Para meterse con las ACL, tendrá que hacer algo de programación; ver la página deacl(3)
manual.fuente