Чому рекурсія не йде вгору за допомогою rm?


13

Мене цікавить напрямок рекурсії взагалі та конкретно rm.

rm рекурсія працює лише вниз правильно?

Запуск: sudo rm -R *.QTFSвидалить усі файли * .QTFS з поточного каталогу та його дітей, правильно?

поточний каталог, що видаються ls -lhaтакож містить .і ..посилання на відсутність кращого слова, так чому б не рекурсії слідувати цим вгору в дереві каталогів? Чи є межа штучного на ют додатка, або .і ..не реальні речі?


5
Тому що корінь, і божевілля, так і лежить ...
jasonwryan


1
Ну, для цікавого анекдоту ... Я запустив rm -rf по деяких невинно дивлячих підкаталогах, щоб тільки на свій жах побачити, що користувач важко пов’язав там речі з дуже важливою течією, яка rm потім продовжувала їсти. Так, у мене були резервні копії, і дані не втрачалися, але нехай це буде застережливою історією ... :-)
Брайан Кноблауч,

@BrianKnoblauch, яку шкоду можна зробити, видаливши жорстке посилання? Я не зрозумів тобі історію ...
Олексій

@Alexey Справа в тому, що сам жорсткий зв’язок не був видалений. Він повторно впав у жорсткий пов'язаний каталог, який був пов’язаний з вищою точкою файлової системи, тому почав їсти дані всіх ...
Брайан

Відповіді:


18

rm рекурсія працює лише вниз правильно?

rm -r x yвидалить xі yвсе, що знаходиться всередині них (якщо вони довідники), але не їхні батьки чи що-небудь поза ними.

Запуск: sudo rm -R *.QTFSвидалить усі файли * .QTFS з поточного каталогу та його дітей, правильно?

Ні. Він видалить усі названі файли *.QTFS, будь-які файли, що рекурсивно всередині викликаються каталогів*.QTFS , і самі ці каталоги. Якщо ви хочете іншої поведінки видалення, скористайтеся find -delete.

поточний каталог, що видаються ls -lhaтакож містить .і ..посилання на відсутність кращого слова, так чому б не рекурсії слідувати цим вгору в дереві каталогів? Чи є межа штучного на ют додатка, або .і ..не реальні речі?

Це штучна межа Росії rm.

Це насправді не все так штучно, проте це єдиний спосіб, коли він міг би працювати. Якщо rmдотримуватися батьківських ..посилань, кожен rm -rвидаляє кожен файл у системі, дотримуючись усіх ..посилань аж до назад /. rmбачить ..і .записи в кожному каталозі, коли він перераховує вміст, і явно нехтує ними з цієї причини.

Насправді ви можете спробувати це самі. Запустити rm -r .і більшість rmреалізацій відмовляться діяти, явно повідомляючи про помилку:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(це повідомлення від GNUrm ; інші схожі). Коли він стикається з цими записами неявно, а не як явні аргументи, він просто ігнорує їх і продовжує продовжувати. Такої поведінки вимагає POSIX . У GNU rmта багатьох BSD це автоматично забезпечується fts_readсімейством ієрархічно-обхідних функцій.

або .і ..не є реальними речами?

.і, ..як правило, реальні записи каталогів, хоча це стосується файлової системи. Вони майже завжди будуть представлені так, ніби вони є реальними записами для всіх кодів користувача, незалежно. Багато частин програмного забезпечення (не тільки rm) спеціально розглядають свою поведінку, щоб зловити або запобігти втечі або небажаній рекурсії.


Для всіх, хто шукає доказів (або просто зацікавлений), погляньте, як це реалізується в ядрах GNU .
Кріс Хейс

@ChrisHayes Еквівалентне посилання gitweb є у відповіді. Фактичний рекурсивний випадок є в fts_readреалізації, хоча це лише для аргументів командного рядка.
Майкл Гомер

@MichaelHomer О, вау, так і є. Цей колір посилання не виділяється на цій схемі SE. Моя помилка.
Кріс Хейс

2
Ця відповідь правильна, але також трохи неточна. rmнавіть не бачить, *.QTFSтому що це глобус розширено на ім'я файлів bash до виклику бінарного файлу rm. @ у відповіді tobyink це зазначає.
Daenyth

Як сторону, як кажуть , саме .та ..поведінка в особливих випадках є причиною існування
точкових файлів

5

Як і те, що написав Майкл Гомер, є ще один фактор, який ускладнює випадкове повторне повторне потрапляння в батьківський каталог.

Зайдіть у свій домашній каталог і введіть щось на кшталт:

echo *s*

Ви побачите, що він показує список файлів і каталогів, що містять букву "s". Однак не відображаються файли, що починаються з провідної точки. Щоб показати їх, ви можете використовувати:

echo .*s*

Це тому, що оболонка відмовляється розширюватися, *щоб охопити провідну крапку. Це означає що:

rm -fr *

Не буде повторюватися ...

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