Удаление файлов и каталогов
В 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 , где оно не будет мозолить глаза, и где можно периодически наводить порядок.
Удаление папки и файлов рекурсивно на C#
Эта короткая заметка о том, как удалить папку и всё ее содержимое рекурсивно. Т.е. если в удаляемом каталоге есть подкаталоги и файлы и в них есть еще подкаталоги с файлами и т.д., все они будут удалены, таким образом будет удалена папка и всё, что в ней содержится.
Способ 1. Удаление каталога методом Delete
Здесь всё просто, нужно лишь второй параметр метода Delete указать равным true
Directory.Delete(folder, true);
folder — соответственно удаляемый каталог, а второй параметр команды говорит о том, что нужно удалить все вложенные каталоги и файлы рекурсивно.
Так же можно обработать исключения, чтобы получить более подробную информацию при неудаче удаления
try < Directory.Delete(folder, true); >catch (DirectoryNotFoundException ex) < Console.WriteLine("Директория не найдена. Ошибка: " + ex.Message); >catch (UnauthorizedAccessException ex) < Console.WriteLine("Отсутствует доступ. Ошибка: " + ex.Message); >catch (Exception ex)
Более подробно о методе Delete можете почитать на docs.microsoft.com
Способ 2. Удаление каталога рекурсивной процедурой
private void deleteFolder(string folder) < try < DirectoryInfo di = new DirectoryInfo(folder); DirectoryInfo[] diA = di.GetDirectories(); FileInfo[] fi = di.GetFiles(); foreach (FileInfo f in fi) < f.Delete(); >foreach (DirectoryInfo df in diA) < deleteFolder(df.FullName); >if (di.GetDirectories().Length == 0 && di.GetFiles().Length == 0) di.Delete(); > catch (Exception ex) < Console.WriteLine("Произошла ошибка: " + ex.Message); >>
Этот способ может пригодиться, если, например, в процессе удаления нужно делать что-то еще, например, писать лог-файл того, что удаляется.
Как рекурсивно удалить тип файла в Linux в каталоге и всех его подкаталогах
Конечно, в некоторых случаях вы проверяли, что у вас есть бесполезный тип файла в нескольких папках, который занимает мало места, но вы просто не хотите, чтобы он был на вашем компьютере. Например, в macOS создаются некоторые файлы. .DS_Store которые сохраняют информацию о значке папки, ее размере и положении, а в Windows существуют аналогичные файлы desktop.ini. Что нам делать, если у нас есть каталог, полный подкаталогов, и мы хотим удалить те или иные типы файлов? Что нам нужно сделать, это рекурсивно стереть Каждый из них.
Это то, что мы можем делать со всеми типами файлов. Например, если у нас есть жесткий диск с музыкой, у нас есть плеер, который загрузил обложки, и мы не хотим, чтобы они сохранялись, мы можем использовать ту же команду, которую мы подробно рассмотрим ниже, чтобы удалить их. Конечно, учитывая, что мы собираемся рекурсивно удалять файлы каталогов и их подкаталоги с помощью терминала, и что они будут потеряны навсегда, не повредит быть осторожным и / или провести тест перед удалением всего, что мы хотим удалить.
Рекурсивно удалять файлы определенного типа с терминала
Команды для примеров файлов macOS .DS_Store будут следующими:
cd ruta/a/directorio find . -name '*.DS_Store' -type f -delete
Из предыдущих команд первая поместит нас в папку, с которой мы хотим начать, то есть ту, которая содержит все файлы .DS_Store, которые мы хотим удалить. Второй — тот, который удалит все файлы .DS_Store из первая папка и ее подпапки или каталоги. Если мы хотим удалить фотографии из ранее упомянутых музыкальных папок, мы должны поместить тип расширения в кавычки, например «* .jpg».
Честно говоря, это то, что я сделаю в тот день, когда перестану использовать Cantata в качестве музыкального проигрывателя по умолчанию. Кантата создает и скрывает информационные файлы с тем же именем, что и песни, у которых есть точка и низкая полоса впереди (например, ._Song). Когда мне это понадобится, мне нужно будет использовать следующую команду: найти. -name ‘._ *’ -type f -delete.
Помогло ли это небольшое руководство вам рекурсивно удалять файлы с терминала?
Теме статьи:
Команда grep: мощный инструмент для поиска текста в Терминале
Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.
Полный путь к статье: Убунлог » Ubuntu » Как рекурсивно удалить тип файла в Linux в каталоге и всех его подкаталогах
2 комментариев, оставьте свой
Оставьте свой комментарий Отменить ответ
Себастьян Кастро сказал
тому назад 3 лет
Спасибо, но в вашем коде есть ошибка. Вам необходимо использовать регулярное выражение «*», то есть «* .DS_STORE». Рекомендую исправить. Что ж, для тех, кто мало знает bash, код, который вы дали, не подойдет. Привет!
Паблинукс сказал
Урок 5. Команда rm — удаление файлов и каталогов
rm файл — удаляет файл, но не каталог.
rm -f файл либо rm —force файл — принудительное удаление файла. Это необходимо тогда, когда у пользователя нет права работать с объектами каталога, в котором находится сам файл.
rm -i файл либо rm —interactive файл — при удалении файла система спросит, действительно ли ты хочешь его удалить. При этом достаточно ввести y(yes) либо n(no)
Кстати, имей ввиду, что объект считается удаленным только тогда, когда удалены все его жесткие ссылки. Подробнее о жестких ссылках поговорим немного позже.
А как узнать их количество?
С помощью команды ls -l
rm -r каталог — рекурсивное удаление всех каталогов и файлов.
Что такое рекурсивное удаление?
Представим, что есть каталог. А в нем еще подкаталоги и файлы, а в тех подкаталогах другие подкаталоги. Чтобы удалить сразу все объкты одним разом, то достаточно при удалении указать корневой родительский каталог и система, начиная с самого низа удалит и файлы и подкаталоги. Данный процесс и называется рекурсивным.
Например, у нас имеется недавно созданный родительский каталог catalogue_A, и в нем имеются дочерние объекты.
Теперь удалим каталог catalogue_A вместе с содержимым и проверим все
rm -r catalogue_A/
После удаления catalogue_A отсутствует.
А можно ввести просто rm catalogue_A/?
Нет, система выдаст ошибку, так как команда rm используется в основном для удаления файлов.
Для удаления отдельных каталогов используется следующая команда:
rmdir каталог — удаление пустых каталогов.
А если он не пустой?
Если он не пустой, то система выдаст ошибку.
В данном случае поможет команда
rmdir —ignore-fail-on-non-empty каталог — удаление непустых каталогов
rmdir -p каталог/подкаталог_1/подкаталог_2 — удаление родительского и всех вложенных в него каталогов. Данная команда работает, когда они не содержат других файлов, кроме самих каталогов и подкаталогов.
Для большей информативности можно использовать опцию -v (—verbose)