Linux быстро удалить много файлов

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Удаление каталога с множеством файлов (способы быстрого удаления каталога)

Модератор: Bizdelnick

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

Сообщение Gineaser » 14.05.2011 17:40

Привет, форумчане.
Знакомый подсказал, что данный вопрос уже затрагивался где то на форуме, но поискав, я не нашел схожей ветки.
Вопрос скорее не совсем можно отнести в раздел «Вопрос новичка», но более подходящего места ему не вижу.

По работе столкнулся с достаточно, казалось бы, тривиальной задачей — удаление определенного каталога.
Но главная проблема заключается в том, что в следствие ошибки предыдущего администратора в конфигурации nginx-а, кеш проекта не отрабатывает возложенную на него функцию. Каждое обновление страницы приводило к созданию новых кеш-файлов, размером от 1 кб и выше, без удаления предыдущих файлов.
Опять же по недосмотру работника, удаленный сервер, находящийся в германии забился чуть меньше чем террабайтом мельчайших файлов.
Ошибка с конфигом nginx решена. Осталось вычистить каталог с кешем.
Команда rm -rf просто зависает.
Сейчас удаляю файлы через find . -type f -delete, процесс в памяти занимает больше 2 гб, и сильно забивая процессорное время.

10 гиг вычищается почти пол дня, что естественно нереально долго, как таковое вешает проект (бд, веб объвязку)

Хотел бы узнать каким еще способом можно удалить быстрее чем сейчас длится этот процесс?

К примеру в ntfs разделах, в системах Windows можно удалять файлы игнорируя комментарии, что значительно быстрее.

Сервер под управлением Debian 6 Squeeze, файловая система на сервере ext3.

Источник

Удалить разом несколько файлов

Здравствуйте! Есть каталог, /opt/sof/bd/. В bd находится очень много файлов, требуется одним разом удалить все файлы с разрешением .txt и файлы в которых есть имя «abc» (abc01,abc02,abc03 и т.д.)

Здесь порылся нашел, что такое можно реализовать через команду find.

больше 1000 это херня: rm -f /opt/sof/bd/abc* /opt/sof/bd/*.txt

Если больше миллиона, то читай сюда: https://habr.com/post/157613/

Это развернёт шелл, в строку оно не влезет и пошлёт в задницу.

Оберни в кавычки, ибо * разворачивает шелл, и разворачивает скорее всего в ничего.

требуется одним разом удалить все файлы с разрешением .txt и файлы в которых есть имя «abc» (abc01,abc02,abc03 и т.д.)

про экранирование шаблонов уже подсказали

«-delete» в find чем не подходит ?

Эм, даже не в курсе)) Просто понадобилось вот удалить из базы, N-ое количество файлов))

А если нужно не удалить? А перенести, допустим «*.txt» в другой каталог?

Если надо не переносить, а именно удалять, у find есть даже специальный ключик для этого, -delete. Пожалуйста, посмотрите в эту сторону, т.к. при этом нагрузка меньше на систему, меньше процессов создается и тратится меньше памяти.

Тебя он пошлет в задницу.

Читайте также:  Как открыть папку с правами администратора linux

разворот *.txt в набор файлов очень долгое и гиблое дело. может памяти не хватить.

чистил архивы тайловых карт

300 000 файлов в куче вложенных директорий общим весом под сотню гигов.

кстати до сих пор не понимаю почему все так упираются в мудрености «-exec rm <> \;» и «-print0 | xargs -0 rm -f» когда в самом find есть отличная опция

Ну так у него больше 1000, копейки.

Ничего не удаляет!

нафиг файнд для одного каталога?
cd /opt/sof/bd/
rm *abc*.txt
rm *.txt*
rm *abc*

Но вообще у меня /opt root:root То есть:

Может потому, что 1 команда проще, чем 4? )

я и так от рута

кстати до сих пор не понимаю почему все так упираются в мудрености «-exec rm <> \;» и «-print0 | xargs -0 rm -f» когда в самом find есть отличная опция -delete

Потому что в posix find нет -delete, но есть зато вместо точки с запятой плюсик, то есть запустит одной командой столько сколько возможно аргументов.

Потому что в posix find нет -delete, но есть зато вместо точки с запятой плюсик, то есть запустит одной командой столько сколько возможно аргументов.

Осталось лишь найти posix find, которого нет в самых популярных дистрибутивах.

Осталось лишь найти posix find, которого нет в самых популярных дистрибутивах.

Очень умно, ага. posix как стандарт определяет минимум, потому он у вас есть в популярных дистрибутивах.

Да, действительно удаляет только последнюю выборку. Был не прав.

Вот так будет работать:

Очень умно, ага. posix как стандарт определяет минимум, потому он у вас есть в популярных дистрибутивах.

И что? В большинстве дистров есть -delete, который работает проще и быстрее. Пользуются таким администраторы, которые явно не делают платформонезависимый софт.

Отсутствие -delete в стандарте лишь говорит о косности последнего.

отсутствие фич в станадрте лишь говорит о том что давно не выпускали новых версий стандартов 🙂

и это стандартнее стандартов 🙂

Да ни чо. Задали вопрос, я — ответил. delete — очень узкая задача, а знание -exec <> + — гораздо полезнее, так как позволяет запустить любую программу с максимальным количеством аргументов на любой posix-, а значить и unix-like системе, и в отличии от -print0 | xargs -0 — «работает проще и быстрее». Потому — знать это полезно, если б pfg этот вариант упомянул того комментария вообще от меня не было.

отсутствие фич в станадрте лишь говорит о том что давно не выпускали новых версий стандартов 🙂

Я посмотрел, последнее обновление 2017 год. Просто легче нарисовать новую циферку на обложке, чем добавить содержимое.

новые функции — новые проблемы (с) любой программист.

так что лучше не надо нового если работает комбинация из старого 🙂 каменный топор исправно служил человечеству на несколько порядков дольше чем все остальные инструменты вместе взятые.

Вот это верно подмечено:) работает не трогай)) Всем спасибо за ответы:)

Осталось выяснить какой find быстрее сделает с -delete или без него.

Читайте также:  Как перекинуть windows через usb

exec спавнит детей, логично предположить что быстрее без

Источник

Как удалить файлы и каталоги с помощью командной строки Linux

В этом руководстве мы покажем вам, как использовать команды rm , unlink и rmdir для удаления файлов и каталогов в Linux.

Как удалить файлы

Чтобы удалить (или удалить) файл в Linux из командной строки, используйте команду rm (remove) или unlink .

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

Будьте особенно осторожны при удалении файлов или каталогов, потому что после удаления файла его будет нелегко восстановить.

Чтобы удалить один файл, используйте команду rm или unlink за которой следует имя файла:

Если файл защищен от записи, вам будет предложено подтвердить, как показано ниже. Чтобы удалить тип файла y и нажмите Enter . В противном случае, если файл не защищен от записи, он будет удален без запроса.

Чтобы удалить сразу несколько файлов, используйте команду rm после которой укажите имена файлов, разделенные пробелом.

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

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

Используйте rm с параметром -i для подтверждения каждого файла перед его удалением:

Чтобы удалить файлы без запроса, даже если файлы защищены от записи, передайте параметр -f (force) команде rm :

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

Как удалить каталоги (папки)

В Linux вы можете удалять / удалять каталоги с помощью rmdir и rm .

rmdir — это утилита командной строки для удаления пустых каталогов, а с помощью rm вы можете рекурсивно удалять каталоги и их содержимое.

Чтобы удалить пустой каталог, используйте rmdir или rm -d за которым следует имя каталога:

Чтобы удалить непустые каталоги и все файлы в них, используйте команду rm с параметром -r (рекурсивный):

Если каталог или файл в каталоге защищен от записи, вам будет предложено подтвердить удаление.

Чтобы удалить непустые каталоги и все файлы без запроса, используйте rm с параметрами -r (рекурсивный) и -f :

Чтобы удалить сразу несколько каталогов, используйте команду rm -r после которой укажите имена каталогов, разделенные пробелом.

Как и в случае с файлами, вы также можете использовать подстановочный знак ( * ) и обычные расширения для соответствия нескольким каталогам.

Выводы

К настоящему времени вы должны хорошо понимать, как использовать команды Linux rm , rmdir и unlink и у вас должна быть возможность безопасно удалять файлы и каталоги из командной строки.

Источник

Быстрое удаление каталога с огромным количеством вложенных файлов и подкаталогов

Столкнулся с проблемой следующего рода:

Имеется каталог, с большим количеством подкаталогов и уровнем вложенности который определить не представляется возможным.
Общий размер каталога около 20Гб, количество файлов более 10 млн. Точное количество файлов определить не хватило терпения (более 3 часов ждал, не долждался), а размер определил методом: вычесть из общего размера занятого на диске размер прочих каталогов, чей размер определить удалось.

Читайте также:  Sapi для windows 10

Задача: удалить этот каталог со всем его содержимым за минимальный промежуток времени и с минимальным износом ЖД (все это дело на ноутбуке).

пробовал сделать «rm -rfd folder_name», ждал 3 часа, освободило не более 3 Гб и с каждым часом скорость очистки замедлялась.

Может кто другие, более производительные методы подскажет?

перенести все остальное на другой винт, а этот форматнуть и впредь так не делать

подробнее пожалуйста, если можно?

а) +1 за идею забэкапить все кроме этого каталога, снести все нафиг, восстановить все кроме каталога

б) поставить rm -rf на ночь или выходные и не париться, ничего жесткому диску не будет

А по inode-у удалить разве нельзя? Грохни inode каталога и все, прощай файлики. How to: Linux / UNIX Delete or Remove Files With Inode Number

ждал 3 часа, освободило не более 3 Гб

Ну подожди еще сутки. Можно подумать, ты эти три часа педали крутил чтоб оно удалялось.

И дальше по теме 🙂

Ну, или для Ъ — rsync

Стандартное решение: unlink верхней директории, следом umount и fsck.

unlink не работает с каталогами

Дык, я только что сидел, пытался. Оказывается, поломали, сволочи!

Надо восстановить справедливость и пропатчить glibc, чтобы unlink перестал проверять, является ли хрень по указанному адресу директорией, если его запускают от рута.

или ты имел в виду сискол?

Да пофиг. Главное — поломали же такую классную вещь.

потом fsck скажет что ему вусмерть надо поработать и вернет всё в lost+found

Чушь. И да, на reiserfs нет директории lost&found!

А про износ диска ТС-у никто не ответил. Может ему нужно перемонтировать ФС или что написать в /proc, чтобы было усиленное кеширование записи?

Такое вытворял не я, а человек работавший ранее на этом рабочем месте. Сносить все это хозяйство опять же не предоставляется возможным, слишком много инфы + / & /home в одном разделе, так что.

Я не думаю, что разовое удаление такого каталога заметно скажется на износе диска.

А вот если задача становится многократно, я бы посоветовал посмотреть в сторону reisrefs. Мне часто приходится работать с кешами, когда несколько десятков или сотен тысяч файлов на несколько гигабайт или десятков гигабайт лежат в на 2-3 уровнях вложенности в подкаталогах. ext4 на такой структуре через какое-то время использования становится адом. Я несколько лет мучился, пока не рискнул reisrefs проверить, памятуя, что лет 10-15 назад серьёзных проблем с такими структурами (с небольшими поправками на развитие железа) у меня не было. А вправду, одна только синхронизация по rsync на таких объёмах, занимая на ext4 десяток минут, на reiserfs отрабатывает за минуту. Даже (на машинах без lvm, когда легко не переразбить диск) быстрее оказывается в плане скорости поставить reisrefs в файл-образ на ext4.

Источник

Оцените статью