Як rm -r іде на рекурсивне видалення? У якому порядку?


30

Чи є якийсь порядок операцій rm? Я виступав rmу великому каталозі і мені цікаво, де я повинен подивитися, що можна було видалити. Чи rmспочатку працюють файли, потім каталоги? Або він базується на деякій інформації в таблиці inode?

Характеристики: rm від GNU coreutils 8.22: Арка Linux, що працює на файловій системі beagleboneblack, на якій працював зовнішній жорсткий диск Seagate (ext4) за допомогою USB 2.0.

Посилання:

Я виконував чистку каталогів і виконував

cp -r A/ B/ C/ Dest/

Мимоволі я стежив за цим

rm -r A/ B/ C/ Dest/

коли я мав на увазі просто виконати

rm -r A/ B/ C/

Я зловив це і натиснув Ctrl+ Cдо того, як занадто довго пройшло. Зокрема, це було <3 секунди, коли я використовував timeкоманду спільно з rm& cp. Я зайшов і оглянув, Dest/очікуючи, що його не буде, але ось воно ціле і, здається, не постраждало. Це трохи дивно, оскільки A/ B/ C/були зовсім маленькими. Можливо, всього 100–200 МБ. Dest/однак, просто соромлячись 1 ТБ. Виконання lsна Dest / / показало, що на обох кінцях алфавіту були і файли, і каталоги (наприклад, AFile.txt.... .... Zoo.txt).

Чи пощастило мені та скасувало rmраніше, як це спричинило хаос у моєму пункті призначення / каталогу? Невже rmтак повільно (на щастя!)?

Якщо ні, то як відбувається rmрекурсивне видалення речей таким чином, що я можу здогадатися, що могло бути втрачено?

Я не дуже сподіваюсь відновити те, що, можливо, втратив, просто цікаво, що потенційно підірвало.


Відповіді:


34

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

Це точно такий же метод , що і інші додатки використовують для траверси каталогів рекурсивно - find, ls -Rfі т.д.

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

Зауважте, що lsабо echo *сортуйте файли у лексикографічному порядку їх імен. findі ls -fне сортувати.

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

Швидкість роботи rmв основному полягає в тому, скільки файлів потрібно видалити. Потрібен дуже великий файл, щоб помітно вплинути на час видалення. Основна частина роботи по черзі видаляє кожен запис каталогу. Дані файлу не стираються, для стирання вмісту файлу потрібно лише позначити блоки, які він використовував, як вільні, що відносно швидко.


2
Цей -fпараметр lsзадокументований як еквівалентний -aU, де -aозначає список усіх файлів і -Uнесортованих засобів. Я смутно згадую, що зустрічався з версією, lsв якій -fне працювало (я думаю, це було визначено як щось інше), але -aUце було.
G-Man каже: "Відновіть Моніку"

2
@ G-Man POSIX визначає -f(як розширення XSI ); це дійсно має інші наслідки, крім несортованих. Він повертається до V7, тож вам важко буде знайти реалізацію без неї, окрім, як не дивно, BusyBox. -Uбо лише несортований є функцією GNU, я не думаю, що він існує деінде.
Жил "ТАК - перестань бути злим"


@Tim Ні. Ви можете перевірити, запустивши ls -Uв каталог. Це той самий порядок, який rm -rби працював у цьому каталозі. Зауважте, що додавання або видалення файлу може змінити порядок інших файлів.
Жил "ТАК - перестань бути злим"

Спасибі. (1) "додавання або видалення файлу може змінити порядок інших файлів.", Тож після випадкового часткового видалення ls -Uне допомагає з'ясувати, чи не залишилися недоторкані вцілілі дрі? (2) -U означає "список записів у порядку каталогу". Чи означає -U означає порядок записів каталогів у dir?
Тім

5

Як каже Гілль, ви не можете загалом передбачити порядок видалень в каталозі, лише те, що каталоги верхнього рівня будуть оброблятися в порядку в командному рядку.

Однак ви також гарантуєте, що вона видалить ієрархії каталогів знизу вгору, оскільки Unix дозволяє видаляти каталоги лише тоді, коли вони порожні. Отже, щоб видалити каталог, спочатку потрібно видалити все, що в ньому. Якщо він містить підкаталоги, він повинен спочатку видалити їхній вміст тощо.

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