Что такое рекурсивное удаление
Перейти к содержимому

Что такое рекурсивное удаление

  • автор:

Удаление файлов и каталогов

В Linux для удаления файлов предназначена утилита rm (сокращение от англ. «remove» — «удалять»).

[methody@localhost methody]$ rm examples/text [methody@localhost methody]$ ls -l text-hardlink -rw-r--r-- 1 methody methody 653 Сен 30 10:04 text-hardlink [methody@localhost methody]$ rm text-hardlink [methody@localhost methody]$ ls -l text-hardlink ls: text-hardlink: No such file or directory

Пример 16. Удаление файла

Разобравшись в ссылках, Мефодий решил удалить файл text в каталоге examples . После этого файл text-hardlink в домашнем каталоге Мефодия, который является жёсткой ссылкой на удалённый файл text продолжает благополучно существовать. Единственное отличие, которое заметил Мефодий — количество жёстких ссылок на этот файл теперь уменьшилось с « 2 » до « 1 » — действительно, text-hardlink — теперь единственное имя этого файла. Получается, что Мефодий удалил только одно из имён этого файла (жёсткую ссылку), сам файл остался нетронутым.

Однако если Мефодий удалит и жёсткую ссылку text-hardlink — у этого файла больше не останется ни одного имени, он станет недоступным пользователю файловой системы и будет уничтожен.

Утилита rm предназначена именно для удаления жёстких ссылок, а не самих файлов. В Linux, чтобы полностью удалить файл, требуется последовательно удалить все жёсткие ссылки на него. При этом все жёсткие ссылки на файл (его имена) равноправны — среди них нет «главной», с исчезновением которой исчезнет файл. Пока есть хоть одна ссылка, файл продолжает существовать. Впрочем, у большинства файлов в Linux есть только одно имя (одна жёсткая сслылка на файл), поэтому команда rm имя файла успешно удалит файл в большинстве случаев.

Как уже говорилось, символьные ссылки — это отдельные файлы, поэтому после того, как Мефодий удалил файл text , text-symlink , который ссылался на этот файл, продолжает существовать, однако теперь это — «битая ссылка», поэтому его также можно удалить командой rm .

Мефодий решил создать каталог для разных упражнений — test , а потом решил обойтись одним каталогом examples . Однако команда rm не сработала, заявив, что test — это каталог:

[methody@localhost methody]$ mkdir test [methody@localhost methody]$ rm test rm: невозможно удалить `test': Is a directory [methody@localhost methody]$ rmdir test [methody@localhost methody]$

Пример 17. Удаление каталога

Для удаления каталогов предназначена другая утилита — rmdir (от англ. «remove directory»). Впрочем, rmdir согласится удалить каталог только в том случае, если он пуст: в нём нет никаких файлов и подкаталогов. Удалить каталог вместе со всем его содержимым можно командой rm с ключом « -r » (recursive). Команда rm -r каталог — очень удобный способ потерять в одночасье все файлы: она рекурсивно обходит весь каталог , удаляя всё, что попадётся: файлы, подкаталоги, символьные ссылки. а ключ « -f » (force) делает её работу ещё неотвратимее, так как подавляет запросы вида «удалить защищённый от записи файл», так что rm работает безмолвно и безостановочно.

«Рекурсивно» по отношению к каталогам обозначает, что действие будет произведено над самим каталогом, его подкаталогами, подкаталогами его подкаталогов и т. д.

Помните: если вы удалили файл, значит, он уже не нужен, и не подлежит восстановлению!

В Linux не предусмотрено процедуры восстановления удалённых файлов и каталогов. Поэтому стоит быть очень внимательным, отдавая команду rm и, тем более, rm -r : нет никакой гарантии, что удастся восстановить случайно удалённые данные. Узнав об этом, Мефодий не огорчился, но подумал, что впредь будет удалять только действительно ненужные файлы, а всё сомнительное — перемещать с помощью mv в подкаталог ~/tmp , где оно не будет мозолить глаза, и где можно периодически наводить порядок.

Book navigation

  • Предисловие
  • Сеанс работы в Linux
  • Терминал и командная строка
  • Структура файловой системы
  • Работа с файловой системой
    • Текущий каталог
    • Домашний каталог
    • Информация о каталоге
    • Перемещение по дереву каталогов
    • Создание каталогов
    • Копирование и перемещение файлов
    • Файл и его имена: ссылки
    • Удаление файлов и каталогов

    рекурсивное удаление

    Подскажите пожалуйста алгоритм рекурсивного удаления, программа на С.
    Есть раздел на котором множество папок с файлами, с них нужно удалить временные файлы. Заранее спасибо.

    aunt
    29.03.09 15:24:28 MSD

    MikeDM ★★★★★
    ( 29.03.09 15:37:00 MSD )

    Исходники rm посмотри из coreutils, раз уж сам не можешь такую фигню написать.

    anotheranonymous
    ( 29.03.09 15:37:27 MSD )

    >Есть раздел на котором множество папок с файлами, с них нужно удалить временные файлы

    find /home/video/tmp -iname «*.tmp» -exec rm <> \;

    KRoN73 ★★★★★
    ( 29.03.09 15:53:30 MSD )
    Ответ на: комментарий от KRoN73 29.03.09 15:53:30 MSD

    system(«find /home/video/tmp -iname \»*.tmp\» -exec rm <> \\;»);

    imp ★★
    ( 29.03.09 16:34:30 MSD )

    вот пример на Глобальном И Надежном с оффсайта Гобального И Надежного. адаптировать я думаю, сам сможешь, ибо принцип понятен. function unlinkRecursive($dir, $deleteRootToo) < if(!$dh = @opendir($dir)) < return; >while (false !== ($obj = readdir($dh))) < if($obj == '.' || $obj == '..') < continue; >if (!@unlink($dir . '/' . $obj)) < unlinkRecursive($dir.'/'.$obj, true); >> closedir($dh); if ($deleteRootToo) < @rmdir($dir); >return; >

    isden ★★★★★
    ( 29.03.09 16:48:45 MSD )
    Ответ на: комментарий от imp 29.03.09 16:34:30 MSD

    По моему за такое руки надо отрывать 🙂

    anotheranonymous
    ( 29.03.09 18:10:48 MSD )
    Ответ на: комментарий от anotheranonymous 29.03.09 18:10:48 MSD

    Кстати, зачастую, когда задача легко решается на шелле а на сях писать её заколебаться system не такой уж плохой метод :). Но лучше этого избегать.

    true_admin ★★★★★
    ( 29.03.09 20:08:38 MSD )
    Ответ на: комментарий от anotheranonymous 29.03.09 18:10:48 MSD

    > По моему за такое руки надо отрывать 🙂

    Если производительность не важна и переносимости не требуется, почему бы и нет? Читается код легко.

    eXOR ★★★★★
    ( 30.03.09 22:31:38 MSD )
    Ответ на: комментарий от eXOR 30.03.09 22:31:38 MSD

    А кто ошибки будет обрабатывать, может быть Пупкин?

    Balthazar ★
    ( 26.04.09 06:30:18 MSD )
    Ответ на: комментарий от Balthazar 26.04.09 06:30:18 MSD

    Может и Пупкин обработать.

    Как удалить файлы или каталоги рекурсивно в Linux

    Не беспокойтесь. Wondershare Recoverit может вернуть потерянные файлы в течение 3 шагов. Профессиональное программное обеспечение для восстановления данных в Linux является абсолютно надежным и на 100% безопасным.

    Каталог может содержать множество подкаталогов и файлов. При работе с файловой системой Linux может потребоваться удаление всех файлов и подкаталогов в каталоге. Это называется рекурсивным удалением. Для рекурсивного удаления файлов или каталогов (также известных как папки в Windows) в Linux используется команда rm. Команда rmdir удаляет только пустые каталоги. В этом руководстве представлены шаги по рекурсивному удалению файлов и каталогов в Linux.

    В этой статье

    Часть 1. Как удалить каталог рекурсивно в Linux с помощью команды rm

    Краткое описание синтаксиса команды rm для рекурсивного удаления каталогов/папок:

    Синтаксис команды
    Описание

    В Linux и Unix-подобных системах все считается файлом. Другими словами, к «файлам» относятся фотографии, документы, каталоги/папки, SSD/жесткие диски, сетевые карты, USB-устройства, клавиатуры, принтеры и сетевые соединения.

    Примеры рекурсивного удаления папки

    В этом примере мы рекурсивно удалим папку data в текущем домашнем каталоге:

    rm -r /home/vivek/data/

    Перед удалением каталога data указанный каталог /home/vivek/data/ будет очищен от всех подкаталогов, включая их подкаталоги и файлы. Если в командной строке не указана опция -f (force), пользователю будет предложено удалить все файлы, защищенные от записи в каталогах:

    rm -rf dirname-here

    В качестве альтернативы можно использовать следующую команду:

    rm -r -f /path/to/folder/

    Для удаления папки, имя которой начинается с буквы » — «, например » -dsaatia «, используйте одну из следующих команд:

    Вы также можете выполнить следующую команду:

    Для просмотра подробных результатов можно использовать опцию -v . Другими словами, команда rm в Linux будет объяснять, что происходит с нашими файлами и папками. Например:

    rm -rfv /path/to/dir1
    rm -r -f -v /home/vivek/oldpartpics

    Удаление папок с уникальными символами имен

    Ваши папки и файлы могут содержать пробелы, точки с запятой, обратные слеши и другие символы в Linux. Например:

    Предположим, что у нас есть папка «Our Sales Data«, а в ней » baddir# » или » dir2 ;# «. Как же избавиться от каталогов с необычными именами? Решение простое. Заключим проблемное имя файла или папки в кавычки. В качестве примера:

    rm ‘Our Sales Data’
    rm -rfv ‘/path/to/Dir 1 ;’
    rm -r -f -v «baddir#»
    rm a\ long \dir1 \name

    Иногда перед мета-символом в имени файла или папки требуется обратная косая черта ( \ ):

    рекурсивно удалить каталог или папку

    Часть 2. Как удалять файлы рекурсивно в Linux с помощью команды rm

    Рекурсивное удаление всех файлов

    При использовании флага -r команда rm удаляет содержимое всех типов файлов.

    Но сначала, используя команду ls , посмотрим на домашние каталоги. В данном примере имеется пять каталогов: Desktop, dir2, Documents, Downloads и removerecurdir.

    использование команды ls

    Предположим, что мы хотим удалить каталог removecurdir и его содержимое, включая все файлы и подкаталоги. Выполните приведенный ниже синтаксис.

    rm -r removerecurdir/

    Вывод ls показывает, что каталог и его содержимое были успешно удалены.

    рекурсивное удаление файлов в linux

    Рекурсивное удаление файлов по размеру

    Ниже описаны шаги по рекурсивному удалению файлов (

    Синтаксис команды find следующий:

    В приведенном ниже примере для доступа к защищенным файлам можно использовать команду sudo .

    sudo find /var/log -type f -size -10M -exec rm <> +

    Знак минус ( — ) должен быть заменен на знак плюс ( + ).

    В следующем примере я использую предыдущий синтаксис для удаления файлов размером более 1 ГБ.

    find /var/log -type f -size +1G -exec rm <> +

    Рекурсивное удаление файлов по расширению (тип файла)

    В следующем разделе описано, как удалять файлы рекурсивно по расширению или типу файла.

    Найдите содержимое домашнего каталога, который называется testhint с помощью команды tree.

    Родительский каталог testhint имеет файл (file1.txt) и два подкаталога: testhint2 имеет file3.txt, а testhint3 имеет file3 и something.txt.

    родительский каталог testhint

    Предположим, что вы хотите рекурсивно удалить все txt-файлы. Синтаксис следующий:

    Затем выполните эту команду для рекурсивного удаления всех текстовых файлов в родительском каталоге testhint.

    find ~/testhint -type f -name ‘*.txt’ -print -delete

    Все текстовые файлы были удалены, остался только файл file3 без расширения.

    рекурсивно удалить все txt-файлы

    Удалить файлы по расширению можно также с помощью команд find вместе с exec .

    find вместе с командами exec

    Синтаксис для удаления файлов по расширению с командой -exec следующий:

    Выполните приведенную ниже команду для удаления файлов .log.

    find ~/testhint -type f -name ‘*.log’ -exec rm -f <> \;

    Аналогичное решение можно получить с помощью команды xargs . Различие между xargs и exec заключается в том, что exec выполняет функцию rm всякий раз, когда файл соответствует условию. Команда xargs выполняет команду rm один раз для каждого найденного файла, удовлетворяющего условию.

    Чтобы удалить все файлы по расширению с помощью find и xargs , используйте следующий синтаксис:

    удаление расширения с помощью find и xargs

    Введите команду, показанную ниже, чтобы удалить все файлы .c с помощью xargs.

    find . -имя «*.c» -print0 | xargs -0 rm

    И снова выбранные файлы расширения были успешно удалены.

    успешно удалены выбранные файлы расширений

    Рекурсивное удаление всех файлов на основе разрешений

    Давайте посмотрим на новое содержимое каталога testhint. Четыре файла имеют полный доступ (file2, file3.c, file6.c и file7).

    содержимое каталога testhint

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

    Выполните приведенную ниже команду для удаления всех файлов с полным доступом для всех пользователей.

    find ~/testhint -perm 777 -print0 | xargs -0 rm

    удаление всех файлов на основе разрешений

    Рекурсивное удаление файлов на основе времени их модификации или создания

    Выполните следующий синтаксис:

    find ~/testhint -perm 777 -print0 | xargs -0 rm

    Если требуется удалить файлы, созданные или модифицированные в последний день (последние 24 часа), используйте следующую команду, где 1 обозначает количество дней, а символ минус ( — ) — файлы, созданные или модифицированные до заданного количества дней.

    find -type f -mtime -1 -delete

    Замените символ минус на символ плюс, чтобы удалить файлы, созданные или модифицированные до суток, до 24 часов.

    find -type f -mtime +1 -delete

    Часть 3. Что делать, если вы случайно удалили файл или папку в Linux?

    В Linux случайное удаление файла или папки может стать настоящей неприятностью, но есть действия, которые помогут повысить шансы на успешное восстановление:

    • Прекратить работу с компьютером: Чтобы предотвратить дальнейшую потерю данных, немедленно прекратите работу с компьютером и не записывайте новые данные на диск, где находился удаленный файл.
    • Действуйте быстро: Чем дольше вы ждете начала процесса восстановления, тем выше риск необратимой потери данных.
    • Регулярно создавайте резервные копии: Регулярное создание резервных копий позволяет обеспечить наличие последней копии важных данных на случай их случайного удаления.
    • Поддерживайте файловую систему в хорошем состоянии: Регулярное обслуживание диска, например, проверка на наличие ошибок и их исправление, поможет поддерживать файловую систему в хорошем состоянии и облегчит восстановление.

    Лучшие средства восстановления данных Linux также помогут восстановить потерянные или удаленные файлы. Следуя этим советам и используя правильное средство восстановления данных, Вы можете увеличить шансы на успешное восстановление удаленных файлов и папок в Linux.

    Рекурсивное удаление файлов и директорий

    Есть скрипт, который по временному штампу удаляет файлы. Удаление с рекурсией, отчищаются и вложенные директории. После работы скрипта, остаются пустые директории. Подскажите, как еще удалить и отчищенные директории.

    import os import datetime for dirpath, dirnames, filenames in os.walk(r'C:\py\dir_for_remove'): for file in filenames: curpath = os.path.join(dirpath, file) file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath)) if datetime.datetime.now() - file_modified > datetime.timedelta(minutes=5): os.remove(curpath) 

    Отслеживать
    77.2k 6 6 золотых знаков 58 58 серебряных знаков 126 126 бронзовых знаков
    задан 8 ноя 2018 в 9:04
    421 1 1 золотой знак 7 7 серебряных знаков 21 21 бронзовый знак

    если Вас устроил ответ нажмите на галочку, которая слева от ответа и человеку написавшему его будет приятно.

    9 ноя 2018 в 20:04

    2 ответа 2

    Сортировка: Сброс на вариант по умолчанию

    Попробуйте этот вариант:

    import os from datetime import datetime, timedelta for root, dirs, files in os.walk(r'C:\py\dir_for_remove', topdown=False): for file in files: curpath = os.path.join(root, file) file_modified = datetime.fromtimestamp(os.path.getmtime(curpath)) if datetime.now() - file_modified > timedelta(minutes=5): os.remove(curpath) # Проходим по директориями и удаляем пустые for d in dirs: curpath = os.path.join(root, d) if not os.listdir(curpath): os.rmdir(curpath) 

    topdown=False — меняет порядок обхода с конца в начало, что поможет при удалении папок

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *