Як я можу видалити файли 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

Є низка причин, які я не хочу використовувати для цього ні GUI 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

Щоб вирішити помилки "не дозволяється в роботі", використовуйте програму "обхід" мережі безпеки машини :

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

У 10.8 гірського лева, обхід перейшов у "Помічники":

/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 !! Це мені допомогло. Я навіть не пробував інших, тому що це виглядало як "правильний шлях", і справді це дозволило мені вирішити проблему без додаткових питань. Дякую!
трійчатка

Я створив обліковий запис, щоб поставити вам +1. Я шукав кращого рішення для цього, і це було воно. Це зводило мене з розуму. Дякую.
CWS з'являється

3
Дивовижно. Це працює. (хоча я виключаю опцію 'v', щоб не бачити запис для кожного з кількох сотень тисяч файлів), тобто:sudo ...bypass rm -rf /Volumes/...
Brent Faust

6
Це надзвичайно небезпечний метод управління файлами Time Machine; Time Machine використовує жорсткі пов'язані каталоги для посилання на папки, які не змінювались з попередньої резервної копії, однак rmпроцес не розуміє їх, і буде слідувати цим посиланням та видаляти з них файли. Це означає, що ви могли потенційно видалити файли, які також є у старих та новіших резервних копіях, ніж обрані вами, що може завдати непоправної шкоди резервній копії. Рекомендація Arne Stenström щодо використання tmutilна сьогодні є найкращим рішенням.
Харавік

1
Щоб трохи продовжити коментар Харавіка: нормально використовувати rmжорсткі файли , але для папок з жорстким зв’язком це не так. У відповіді Кента згадується та ж проблема. І в чому полягає команда Unix для створення жорсткого посилання на каталог в OS X? хтось написав за 10.5 в 2010 році: "Видалення - це інша історія: якщо ви пройдете про неї звичайним способом видалення каталогів, ви видалите вміст. Отже, ви повинні" від'єднати "каталог: 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 (Гірський лев) не потребував обходу. Просто sudo tmutil delete <snapshot-dir>. Популярна bypass rmвідповідь застаріла.
Джон Мей

Чи можна використовувати tmutilдля видалення лише декількох файлів із знімка? Це не спрацювало для мене ( Invalid deletion target (error 22)), тому я пішов bypassзамість цього.
Роберт Тупело-Шнек

+1 для BLUF. Ви отримали це від (абсолютно дивовижних) менеджерів-інструментів? :)
Олі

Також: Я постійно знаходжу посилання на Backups.backupdbкаталог, який я не бачу на своєму резервному диску (капсулі часу). У мене просто є форми форми 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/нього добре, і впливає лише на резервну копію цієї дати. Кількість посилань на жорстке посилання зменшується, тому " inode " для file2буде видалено, але для inode для 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 X 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 входи (перший стовпець):

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? хтось написав за 10.5 в 2010 році: "Видалення - це інша історія: якщо ви пройдете про неї звичайним способом видалення каталогів, ви видалите вміст. Тому ви повинні " від'єднати "каталог: 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. Ідентичний 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

Примітка: Через "безпечну мережу TM", яку згадував Ерік У., ця відповідь не працює у випадку резервного копіювання Time Machine, до якого конкретно стосується питання. Але для більшості всіх інших випадків інформація про те, як позбутися від АСЛ, є актуальною.


Не потрібно використовувати інструменти ACL, скопійовані зі старої ОС.

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

Для отримання додаткової інформації введіть man chmodі перегляньте розділ "Параметри маніпуляції ACL".

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

chmod -R -N foldername

2

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

Видалення всієї резервної копії не зашкодить. Ви просто видаляєте жорсткі посилання. Жодна інша резервна копія не вплине. Але це можна зробити за допомогою tmutil.

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

Мій резервний диск заповнений. У мене дуже великий файл (багато гігабайт), який резервувались місяцями. Є одна фізична копія, але багато знімків із твердими посиланнями на цю копію. Щоб фактично позбутися цього файлу, мені потрібно видалити жорстке посилання з кожної резервної копії.

Зауважте, що номер inode однаковий для всіх жорстких посилань на один і той же файл.

% 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 (1tb +) і відформатувати накопичувач, перш ніж ми змогли отримати будь-який доступ до нього - і, повірте, я намагався все, щоб змінити дозволи.


2
sudo повинен надати мені доступ до всіх файлів, оскільки я працюю адміністратором. Я впевнений, що це проблема ACL, і я над цим працюю.
Тім

1
Нік, запізнився на кілька років, але якщо ти пропустив це: дивись відповідь Еріка .
Ар'ян

@Tim: це твердження було б навіть неправдивим для інших однокласних систем, враховуючи незмінний атрибут ( chattr). Те, що корінь дасть вам теоретично - це обійти будь-яку мережу безпеки.
0xC0000022L

0

Якщо ви хочете видалити всі файли в папці, а не лише конкретні файли, ви можете досягти цього, додавши папку до списку виключень Time Machine. (Налаштування системи -> Машина часу -> Параметри. Перетягніть папку сюди.)

Наступного разу, коли ви виконаєте резервну копію, копії цієї папки будуть видалені з попередніх резервних копій.

Тепер, якщо ви дійсно хочете зробити це від CLI, є спосіб, хоч і трохи громіздкий.

  1. Зробіть резервну копію /Library/Preferences/com.apple.TimeMachine.plist
  2. Скопіюйте /Library/Preferences/com.apple.TimeMachine.plist кудись, де можна пограти з ним.
  3. СД у те місце, куди ви його не помістите.
  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. Скопіюйте відредагований пліст назад у / Бібліотека / Налаштування /
  9. Запустіть резервну копію, виконавши
    /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -auto

Редагування: Коли ви виконайте крок 9, всі копії щойно виключеної папки будуть видалені з попередніх резервних копій.

Щоб видалити виняток, скопіюйте резервну копію назад у / Бібліотека / Налаштування.


Я не намагаюся виключити каталог. Я намагаюся видалити каталог з існуючої резервної копії та зробити деякі з командного рядка. Дійсно, я просто хотів би розібратися, як дозволити rm працювати в каталозі Backups.backupdb.
Тім

Гаразд, можливо, з моїх інструкцій було незрозуміло, що папка фактично видаляється із резервних копій під час виконання вищезазначених кроків. Дивіться мою редакцію. Але якщо це не рішення, яке ви шукаєте, то, гадаю, ви могли завжди, su - rootа потім rm -rfпапки, але я вважаю, що зіткнення з чимось таким дорогоцінним, як резервне копіювання таким чином, - це те, чого слід взагалі намагатися уникати.
Мороз

Але додавання його як виключення видалить усі його копії з усіх резервних копій. Крім того, хоча це резервне копіювання TimeMachine, я не працюю над цією машиною, тому це вже не активний TimeMachine. Судо має такий же ефект, як "su - root", а потім "rm -rf". Я впевнений, що це не вдається, тому що Apple додала рівень захисту файлової системи за рамки простих дозволів * nix.
Тім

Це може здатися дурним, але я не зовсім впевнений, що sudoмає такий же ефект, як і su - rootна mac. Здається, я пригадую випадок, коли я намагався видалити щось там, де sudoне вистачало, але sudo - rootзробив трюк.
Мороз

3
@ Frost - я не думаю, що машина Time працює так, як ви запропонували. Я просто спробував виключити папку, потім запустити 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).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.