Как я могу удалить файлы Time Machine с помощью командной строки

68

Я хочу удалить некоторые файлы / каталоги из раздела Time Machine с помощью команды rm , но не могу этого сделать. Я почти уверен, что проблема связана с какими-то расширенными атрибутами контроля доступа к файлам в резервной копии, но я не знаю, как их переопределить / отключить, чтобы заставить работать rm . Пример ошибки, которую я получаю:

% 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

Есть ряд причин, по которым я не хочу использовать ни графический интерфейс Time Machine, ни Finder для этого. Если это возможно, я хотел бы иметь возможность поддерживать расширенную защиту для всех других файлов (я бы не хотел отключать их глобально, если только я не смогу повторно включить их после выполнения своей работы).

Тим
источник
Я подошел ближе. Сначала мне нужно было отключить ACL на диске Time Machine. Ранее для этого можно было бы использовать fsaclctl, но Snow Leopard не включает это. Я взял копию двоичного файла из более старой версии OSX и запустил это:% sudo fsaclctl -p / Volumes / tmvol -d Затем я попытался использовать «sudo rm -rf» для удаления каталога, но все еще сталкивался с проблемами с некоторые файлы (хотя другие ушли нормально). В частности, это не удалось на мягких ссылках. Очень странно. С положительной стороны, ссылки занимают почти нет места. С другой стороны, у меня все еще есть каталоги.
Тим
Кажется, что принятый ответ довольно опасен при удалении снимков или папок в снимках, таких как ваш rm -r Backups.backupdb/MacBook/Latest/MacBook/somedir; если вы согласны, то, пожалуйста, примите ответ Арне?
Арджан

Ответы:

115

Чтобы обойти ошибки «операция не разрешена», используйте программу обхода Time Machine Safety Net :

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

В 10.8 Mountain Lion объезд перешел в «Помощники»:

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

В 10.10 Йосемити перебрался сюда:

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

Будьте осторожны при использовании этого для удаления определенных снимков: поскольку Time Machine использует жесткие ссылки, использование rm -rпапок также может повлиять на более старые и новые снимки одного и того же компьютера . (См. Другие ответы, относящиеся к tmutil deleteбезопасному удалению определенного снимка.) Впрочем, использование rmдля удаления всех снимков для одного компьютера вполне допустимо. И поэтому используется rmдля удаления определенного файла, который удалит только этот файл с жесткой связью из указанных снимков, если он не находится в каталоге с жесткой связью, поскольку тогда вы фактически удалите файл из всех эти жестко связанные каталоги.

Эрик У
источник
+1 !! Это помогло мне. Я даже не пробовал другие, потому что это выглядело как «правильный путь», и действительно, это позволило мне решить проблему без дополнительных вопросов. Спасибо!
tripleee
Я создал аккаунт только для +1 вам. Я искал лучшее решение для этого, и это было этим. Это сводило меня с ума. Спасибо.
CWSpear
3
Потрясающие. Это работает. (хотя я опускаю опцию 'v', чтобы не видеть записи для каждого из нескольких сотен тысяч файлов), то есть:sudo ...bypass rm -rf /Volumes/...
Brent Faust
6
Это чрезвычайно опасный метод для управления файлами Time Machine; Time Machine использует жестко связанные каталоги для ссылки на папки, которые не изменились со времени предыдущего резервного копирования, однако rmпроцесс не понимает их и будет переходить по этим ссылкам и удалять файлы из них. Это означает, что вы можете удалить файлы, которые также находятся в более старых и более новых резервных копиях, чем та, которую вы выбрали, что может нанести непоправимый ущерб резервным копиям. Рекомендация Арне Стенстрём об использовании tmutilявляется безусловно лучшим решением.
Харавикк
1
Чтобы немного расширить комментарий Харавикка: использование rmжестко связанных файлов - это нормально, а для жестко связанных папок - нет. В ответе Кента упоминается та же проблема. А в Что такое команда Unix для создания жесткой ссылки на каталог в OS X? в 2010 году кто-то написал для 10.5: «Удаление - это другая история: если вы будете использовать обычный способ удаления каталогов, вы удалите содержимое. Поэтому вы должны« отсоединить »каталог: unlink new_hard_link». Так что используйте это только для удаления всех резервных копий (снимков) для данного компьютера.
Арджан
26

BLUF (нижняя строка впереди):

sudo tmutil delete snapshot-dir


Использование для удаления всех списков управления доступом из иерархии папок не работает над файлами и папками с помощью Time Machine Backups.backupdb , из - за TM Safety Net механизма и критерии , описанная в этом 318 Tech Journal поста (но , возможно , не так , как описано выше) ,     (Перед изучением этого из поиска Сети безопасности, упомянутой в ответе Эрика В. (которая работает), я тестировал только папку, клонированную из подпапки резервной копии TM, и там chmod работал. Но пробовал chmod на папке в реальной Резервное копирование TM выдает ошибку «Операция не разрешена».)sudo chmod -R -N folder

Возможное использование:
    в Mac OS 10.7+ есть команда tmutil (которую я не пробовал, так как я все еще на Snow Leopard). Он имеет глагол удаления , который в соответствии с описанием «может удалять моментальные снимки из резервных копий, которые не были сделаны или не заявлены текущим компьютером» (где «моментальный снимок» - это папка с датой, представляющая одну инкрементную резервную копию). Мне не ясно, означает ли это, что он не может удалять снимки , сделанные или заявленные текущей машиной. (?)

Арне Стенстрём
источник
2
Действительно, tmutil полезен и позволит вам удалить резервные копии ( tmutil delete /Volumes/DISK/Backups.backupdb/HOST/DATE_FOLDER). Тем не менее, вам все еще нужен обходной трюк Эрика, чтобы удалить саму папку «Backups.backupdb».
mivk
Мой OSX 10.8.3 (Mountain Lion) не требовал обхода. Просто sudo tmutil delete <snapshot-dir>. Популярный bypass rmответ устарел.
Джон Ми
Можно ли использовать tmutilдля удаления только некоторые файлы из снимка? Это не сработало для меня ( Invalid deletion target (error 22)), поэтому я пошел с bypass.
RTS - прочитайте о Монике Челлио
+1 для BLUF. Вы получили это от (совершенно потрясающего) Manager-Tools? :)
Оли
Кроме того: я продолжаю находить ссылки на Backups.backupdbкаталог, который не вижу на моем резервном диске (Time Capsule). У меня просто есть вещи в форме MachineName.sparsebundle. Формат изменился? Я пытаюсь использовать команду удаления резервной копии TM, но она застряла на индикаторе прогресса 99,99% на несколько часов.
Оли
12

Предупреждение об использовании bypassкоманды для удаления старой резервной копии: если в удаленной резервной копии есть папки, которые в точности совпадают в более ранних или более поздних резервных копиях, то файлы могут быть также удалены из более ранних или более поздних резервных копий !

Time Machine не только использует жесткие ссылки для неизмененных файлов, но также использует жесткие ссылки для папок, в которых файлы не были добавлены, изменены или удалены вообще. Это приводит к чему-то вроде:

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

С учетом вышесказанного, удаление любого файла из /2014-11-06/folder/в порядке, и влияет только на резервную копию на эту дату. Жесткие подсчет ссылки уменьшаются, так что « индексный дескриптор » для file2будет удален, но дескрипторы для file1и по- file3прежнему будет иметь счетчик ссылок 1 из - за последующие резервные копии. Следовательно, rm -R /2014-11-06тоже хорошо.

Тем не менее, удаление любого файла из любого /2014-11-13/folder/, /2014-11-20/folder/или /2014-11-27/folder/эффективно удалит его из всех этих 3 папок.

Проблема в том, что rm -Rне заботятся о жестко связанных папках. Он просто возвращается в любую жестко связанную папку, которую находит, смело удаляет все свои файлы, а затем удаляет пустую папку.

Итак: при удалении старой резервной копии не следует возвращаться в жестко связанную папку и удалять ее содержимое. Вместо этого нужно удалить только жесткую ссылку для самой папки . Так что вместо того, чтобы rm -Rиспользовать, tmutil deleteкак объяснено в ответе Арне .

Как и в сторону, кажется , что OS X unlinkкоманда не может быть использована в папках : «только один аргумент, который не должен быть каталогом, могут быть поставлены» . API OS X может удалять жестко связанные папки, как и GNU Coreutils , например, установленный с помощью Homebrew .

Наконец, чтобы доказать все вышесказанное, тестовый пример (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

Обратите внимание, что количество ссылок для каждого экземпляра равно 2 (второй столбец). Давайте удалим первое вхождение:

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

Таким образом, после отмены связи одного из файлов количество ссылок уменьшилось до 1 для каждого вхождения, хотя файл все равно отображается 3 раза. Проблем пока нет. Удалите первое вхождение снова:

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

Теперь все прошло. Очевидно, что файл TopSites.plistбыл последний раз изменен 2014-11-06 и жестко связан с 2014-11-13, так как некоторые другие файлы были добавлены, изменены или удалены в Safariпапке. Затем содержимое Safariпапки не изменилось в последующих двух резервных копиях, поэтому в 2014-11-20 и 2014-11-27 Safariпапка была жестко связана с предыдущей резервной копией.

Действительно, в 4 папках используется только 2 inode (первый столбец)

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
Немного предыстории: для файлов жесткие ссылки работают как положено; удаляется только та жесткая ссылка, которую вы хотите удалить. Нравится: touch file1; ln file1 file2; ln file2 file3; ls -li; rm file2; ls -liудалит только одну жесткую ссылку. Но для папок , в Что такое команда Unix для создания жесткой ссылки на каталог в OS X? в 2010 году кто-то написал для 10.5: «Удаление - это другая история: если вы будете использовать обычный способ удаления каталогов, вы удалите содержимое. Поэтому вы должны « отсоединить »каталог: unlink new_hard_link». Это, вероятно, все еще в силе.
Арджан
Страница людей для unlink(в 10.6.8) говорит , что он не может быть использован в каталогах: When the utility is called as unlink, only one argument, which must not be a directory, may be supplied.
Кент
Хм, тайна. Более того, ваш ответ важен: не используйте [bypass] rm -rжестко связанные каталоги. (Но я не обязан вам это объяснять.)
Арджан,
Я просто немного поэкспериментировал. Бег bypass unlink FILEимеет те же (непреднамеренные?) Последствия, что и bypass rm FILE. Идентичный ФАЙЛ удаляется из всех резервных копий, а не только из одного указанного местоположения. И, unlinkНЕ будет принимать каталог или более одного файла в качестве аргумента (сервер 10.6.8; но я не думаю, что это изменится в более новых версиях ОС)
Кент
Ничего себе, я очень удивлен вашим bypass rm FILEи bypass unlink FILEудаляя все одинаковые файлы, которые не соответствуют тому , что один видит за touch file1; ln file1 file2; ln file2 file3; ls -li; unlink file2; ls -li, ни за touch file1; ln file1 file2; ln file2 file3; ls -li; /System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass unlink file2; ls -li. Я никогда не собираюсь удалять что-либо из резервной копии ...
Арджан
3

Примечание. Из-за упоминания Эрика У «Сети безопасности ТМ» этот ответ не работает в случае резервной копии Time Machine, к которой конкретно относится этот вопрос. Но для большинства других случаев информация о том, как избавиться от ACL, актуальна.


Нет необходимости использовать инструменты ACL, скопированные со старой ОС.

Используйте ls -leдля просмотра списков ACL и chmodих изменения.

Для получения дополнительной информации, введите man chmodи посмотрите в разделе «Параметры манипуляции ACL».

Команда для удаления всех ACL из иерархии папок:

chmod -R -N foldername
Баран
источник
2

Машина времени работает как rshapshot. Он создает дерево жестких ссылок для каждой новой резервной копии. Жесткие ссылки на файлы, уже существующие в предыдущей резервной копии, занимают очень мало дополнительного места. Только когда последняя жесткая ссылка на файл удаляется, файл фактически удаляется из файловой системы.

Удаление всей отдельной резервной копии не повредит. Вы просто удаляете жесткие ссылки. Другие резервные копии не будут затронуты. Но это может быть достигнуто через tmutil.

Один сценарий, в котором может быть необходимо обойти защиту, - удалить определенный файл из всех резервных копий (и причину, по которой я оказался в этом посте).

Мой резервный диск заполнен. У меня есть очень большой файл (много гигабайт), резервная копия которого месяцами. Существует одна физическая копия, но множество снимков с жесткими ссылками на эту копию. Чтобы на самом деле избавиться от этого файла, мне нужно удалить жесткую ссылку из каждой резервной копии.

Обратите внимание, что номер индекса одинаков для всех жестких ссылок на один и тот же файл.

% 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

(Последний - просто символическая ссылка на последний каталог с датой)

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

Файл удаляется из всех резервных копий, и возвращается место. Если файл менялся с течением времени, у каждой резервной копии будет полная копия, а возвращаемое пространство будет огромным.

односложный
источник
Что касается «Удаление всей отдельной резервной копии не повредит. Вы просто удаляете жесткие ссылки. Никакая другая резервная копия не будет затронута». : Если это относится к снимкам в резервных копий для одной машины, а затем дал (старый) ответ Кента с помощью rm -rможет быть (или: были) опасными. Лучше быть в безопасности, чем потом сожалеть и использовать tmutilдля этого.
Арджан
0

Если вы не выполняете команду как пользователь, которому «принадлежит» резервная копия, вам будет сложно удалить ее из командной строки. У меня просто была эта проблема с миграцией, и мы должны были выполнить полное резервное копирование Time Machine (1 ТБ +) и отформатировать диск, прежде чем мы смогли получить какой-либо доступ к нему - и поверьте мне, я попробовал все, чтобы переопределить разрешения.

Nic
источник
2
sudo должен дать мне доступ ко всем файлам, так как я работаю от имени администратора. Я почти уверен, что это проблема ACL, и я работаю над этим.
Тим
1
Ник, на несколько лет опоздал, но на случай, если ты пропустил это: см . Ответ Эрика .
Арджан
@Tim: это утверждение было бы неверным даже в других unixoid-системах, учитывая неизменяемый атрибут ( chattr). Теоретически рут даст вам возможность обойти любую сеть безопасности.
0xC0000022L
0

Если вы хотите удалить все файлы в папке, а не только определенные файлы, вы можете сделать это, добавив папку в список исключений Time Machine. (Системные настройки -> Time Machine -> Параметры. Перетащите сюда папку.)

В следующий раз, когда вы выполните резервное копирование, копии этой папки будут удалены из предыдущих резервных копий.

Теперь, если вы действительно хотите сделать это из CLI, есть способ, хотя и немного громоздкий.

  1. Сделайте резервную копию /Library/Preferences/com.apple.TimeMachine.plist
  2. Скопируйте /Library/Preferences/com.apple.TimeMachine.plist куда-нибудь, где вы можете поиграть с ним.
  3. Cd туда, куда вы положите.
  4. Выполните,
    plutil -convert xml1 com.apple.TimeMachine.plist
    чтобы преобразовать его из двоичной формы.
  5. Откройте преобразованный список в предпочтительном текстовом редакторе, найдите «Skippaths»
  6. Вставьте новую строку в этот раздел, отформатированный как <string>/Path/To/Exclude</string>
  7. Сохранить и выйти, преобразовать обратно, выполнив
    plutil -convert binary1 com.apple.TimeMachine.plist
  8. Скопируйте отредактированный список обратно в / Library / Preferences /
  9. Запустите резервное копирование, выполнив
    /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto

Редактировать: при выполнении шага 9 все копии вновь исключенной папки будут удалены из предыдущих резервных копий.

Чтобы удалить исключение, скопируйте резервную копию обратно в / Library / Preferences.

иней
источник
Я не пытаюсь исключить каталог. Я пытаюсь удалить каталог из существующей резервной копии и сделать некоторые из командной строки. На самом деле, я просто хотел бы выяснить, как разрешить rm работать в каталоге Backups.backupdb.
Тим
Хорошо, возможно из моих инструкций не было ясно, что папка фактически удаляется из резервных копий при выполнении вышеуказанных шагов. Смотрите мое редактирование. Но если это не то решение, которое вы ищете, то я думаю, что вы всегда можете, su - rootа затем rm -rfи папки, но я думаю, что возиться с чем-то таким ценным, как резервные копии, - это то, чего обычно следует избегать.
Мороз
Но добавление его в качестве исключения приведет к удалению всех копий из всех резервных копий. Кроме того, хотя это резервное копирование TimeMachine, это не с компьютера, на котором я выполняю эту работу, поэтому он больше не является активным TimeMachine. sudo имеет тот же эффект, что и «su - root», а затем «rm -rf». Я почти уверен, что это не сработало, потому что Apple добавила уровень безопасности файловой системы сверх простых * nix-разрешений.
Тим
Это может звучать глупо, но я не совсем уверен, что это sudoимеет тот же эффект, что и su - rootна Mac. Кажется, я вспоминаю случай, когда пытался удалить что-то, sudoчего не хватало, но sudo - rootсделал свое дело.
мороз
3
@ Мороз - я не думаю, что Time Machine работает так, как ты предлагаешь. Я просто попытался исключить папку, затем запустить TM, и старые копии этой папки все еще присутствуют в TM. Или, возможно, его поведение изменилось с тех пор, как вы опубликовали это почти год назад.
Кофеин Кома
0

Вы можете сделать lsсписок расширенных атрибутов в длинном представлении, используя -@флаг. Это будет список ACL, когда вы поставите -eфлаг. Таким образом, вы можете узнать, с чем имеете дело, используя ls -lea@ DIR.

Судя по моим локальным резервным копиям Time Machine, похоже, что Time Machine применяет расширенные атрибуты с метаданными о самых новых и самых старых снимках. Данные, хранящиеся в xattrs, выглядят как двоичный список. Это кажется безобидным.

Time Machine также рассматривает возможность применения списков ACL к определенным каталогам, о которых он знает, например к тем, которые размещены в стандартном пользовательском каталоге. На вашем пути могут стоять два типа ACL: те, которые применяются непосредственно к файлу или каталогу, которые запрещают удаление, и те, которые применяются к родительскому файлу, который запрещает delete_child.

К сожалению, Mac OS X не предоставляет пользовательских утилит getfaclи setfaclопределяется POSIX.2c для просмотра и управления ACL. Чтобы связываться с ACL, вам придется заняться программированием; см. acl(3)справочную страницу.

Джереми У. Шерман
источник