- Быстрое удаление каталога с огромным количеством вложенных файлов и подкаталогов
- Удаление большого количества файлов в Linux
- Удаление большого количества файлов через find + exec
- Как быстро удалить Очень Много файлов?
- Re: Как быстро удалить Очень Много файлов?
- Каждую неделю вопрос на ЛОРе.
- Use ionice, Luke!
- Re: Как быстро удалить Очень Много файлов?
- Удаляем огромное количество файлов в директориях файловых систем Linux
Быстрое удаление каталога с огромным количеством вложенных файлов и подкаталогов
Имеется каталог, с большим количеством подкаталогов и уровнем вложенности который определить не представляется возможным.
Общий размер каталога около 20Гб, количество файлов более 10 млн. Точное количество файлов определить не хватило терпения (более 3 часов ждал, не долждался), а размер определил методом: вычесть из общего размера занятого на диске размер прочих каталогов, чей размер определить удалось.
Задача: удалить этот каталог со всем его содержимым за минимальный промежуток времени и с минимальным износом ЖД (все это дело на ноутбуке).
пробовал сделать «rm -rfd folder_name», ждал 3 часа, освободило не более 3 Гб и с каждым часом скорость очистки замедлялась.
Может кто другие, более производительные методы подскажет?
перенести все остальное на другой винт, а этот форматнуть и впредь так не делать
подробнее пожалуйста, если можно?
а) +1 за идею забэкапить все кроме этого каталога, снести все нафиг, восстановить все кроме каталога
б) поставить rm -rf на ночь или выходные и не париться, ничего жесткому диску не будет
afiskon ★ ( 27.03.15 14:45:32 MSK )
Последнее исправление: afiskon 27.03.15 14:45:44 MSK (всего исправлений: 1)
А по inode-у удалить разве нельзя? Грохни inode каталога и все, прощай файлики. How to: Linux / UNIX Delete or Remove Files With Inode Number
ждал 3 часа, освободило не более 3 Гб
Ну подожди еще сутки. Можно подумать, ты эти три часа педали крутил чтоб оно удалялось.
KRoN73 ★★★★★ ( 27.03.15 16:25:49 MSK )
Последнее исправление: KRoN73 27.03.15 16:31:31 MSK (всего исправлений: 1)
Стандартное решение: unlink верхней директории, следом umount и fsck.
unlink не работает с каталогами
Дык, я только что сидел, пытался. Оказывается, поломали, сволочи!
Надо восстановить справедливость и пропатчить glibc, чтобы unlink перестал проверять, является ли хрень по указанному адресу директорией, если его запускают от рута.
или ты имел в виду сискол?
Да пофиг. Главное — поломали же такую классную вещь.
greenman ★★★★★ ( 27.03.15 16:49:33 MSK )
Последнее исправление: greenman 27.03.15 16:52:54 MSK (всего исправлений: 1)
потом fsck скажет что ему вусмерть надо поработать и вернет всё в lost+found
Чушь. И да, на reiserfs нет директории lost&found!
А про износ диска ТС-у никто не ответил. Может ему нужно перемонтировать ФС или что написать в /proc, чтобы было усиленное кеширование записи?
Такое вытворял не я, а человек работавший ранее на этом рабочем месте. Сносить все это хозяйство опять же не предоставляется возможным, слишком много инфы + / & /home в одном разделе, так что.
Я не думаю, что разовое удаление такого каталога заметно скажется на износе диска.
А вот если задача становится многократно, я бы посоветовал посмотреть в сторону reisrefs. Мне часто приходится работать с кешами, когда несколько десятков или сотен тысяч файлов на несколько гигабайт или десятков гигабайт лежат в на 2-3 уровнях вложенности в подкаталогах. ext4 на такой структуре через какое-то время использования становится адом. Я несколько лет мучился, пока не рискнул reisrefs проверить, памятуя, что лет 10-15 назад серьёзных проблем с такими структурами (с небольшими поправками на развитие железа) у меня не было. А вправду, одна только синхронизация по rsync на таких объёмах, занимая на ext4 десяток минут, на reiserfs отрабатывает за минуту. Даже (на машинах без lvm, когда легко не переразбить диск) быстрее оказывается в плане скорости поставить reisrefs в файл-образ на ext4.
Удаление большого количества файлов в Linux
При работе сайтов в одном каталоге иногда скапливается очень большое количество файлов — чаще всего это кэш, если файлов в директории на одном уровне слишком много. Могут быть это сотни тысяч и миллионы файлов удалить их стандартными средствами бывает невозможно. В рамках материала будет рассмотрено как удалить большое количество файлов в Linux.
Команда ls, позволяющий в обычных условиях просмотреть содержимое каталога, будут потреблять всю доступную оперативную память (RAM). Команда rm -rf ./* при удалении будет потреблять все ресурсы диска. Будет достигаться лимит по количеству возможных операций ввода-вывода IO (input-output) или в ресурсы процессора.
Удалять файлы можно используя утилиту find. В отличие от ls или rm с указанием маски она не формирует изначально список содержимого каталога, а перебирает файлы по одному.
Посчитать количество файлов можно так
find /home/web/example.com/www/opt/cache/ -type f ¦ wc -l
Удаление большого количества файлов через find + exec
С -exec rm -f можно запустить процесс удаления файлов (он может занять длительное время)
find /home/web/example.com/www/opt/cache/ -type f -exec rm -f <> \;
Можно попробовать find с опцией delete
find /home/web/example.com/www/opt/cache/ -type f -delete
Скорее всего не даст никакого результата rm с указанием файлов по маске. Система при этом до того как начать удаление попытается сформировать полный список файлов, что сделать не получится
Также существует вариант с ls -f, вывод которого перенаправляется в xargs по 100 файлов, затем удаляемых при помощи rm. Может успешно отрабатывать, однако если файлов слишком много вывести список не получится и с ls -f
cd /home/web/example.com/www/opt/cache/ ; ls -f . | xargs -n 100 rm
Самой эффективной командой обычно оказывается find с -exec rm -f. Однако все зависит от количества файлов и использовать стоит все представленные варианты.
Приоритет процессов при удалении имеет смысл максимально понижать используя nice и ionice. Если удаление большого количества файлов вручную требуется регулярно — алиасы можно добавить в .bashrc пользователя. Файл находится в домашнем каталоге пользователя имени которого производится удаление. Потом команды можно запускать по планировщику CRON.
Мы рассмотрели как удалить большое количество файлов в Linux.
Как быстро удалить Очень Много файлов?
Т.е. только мета-инфа весит 330 Мб (верхняя планка, значит, 1,3-1,4 млн. файлов). Списка имён файлов нет.
Вопрос: как их быстро удалить, с минимальной утилизацией винтов (продакшн-сервер) и без потери остальных данных на этом разделе?
Re: Как быстро удалить Очень Много файлов?
rm -dfr /var/www или че там у тебя
Каждую неделю вопрос на ЛОРе.
Этого вопроса ещё нет в FAQ? (Мне лень смотреть)
find . -maxdepth 1 -type f | xargs -0 ls
Use ionice, Luke!
> Т.е. только мета-инфа весит 330 Мб
Неверно, но к делу отношения не имеет.
> Вопрос: как их быстро удалить,
> с минимальной утилизацией винтов (продакшн-сервер)
echo cfq > /sys/block/[диск, где находится ФС]/queue/scheduler
ionice -c3 rm -rf /path/to/dir
P.S. Непонятно, чем они так помешали, что понадобилось их так срочно удалять.
Re: Как быстро удалить Очень Много файлов?
До этого пробовал:
#find ./ -maxdepth 1 -type f -mtime +7 -exec rm -f <> \;
(не хотелось удалять всё), выглядело так:
——————
#strace -s 360 -p 25670
Process 25670 attached — interrupt to quit
getdents64(4, /* 73 entries */, 4096) = 4088
getdents64(4, /* 73 entries */, 4096) = 4088
getdents64(4, /* 73 entries */, 4096) = 4088
getdents64(4, /* 73 entries */, 4096) = 4088
getdents64(4, /* 73 entries */, 4096) = 4088
etdents64(4,
Process 25670 detached
——————
, т.е. видимо строило файл-лист и делало это больше недели, с обычным rm было так же (надо было кстати использование памяти замерить).
А с ionice -c3 rm -dfr dir так:
# strace -s 360 -p 933
——————
Process 933 attached — interrupt to quit
unlink(«4e2a0e62921574187660e5ea2155af7e») = 0
unlink(«6094ad144713c973537c162b9e52b5d5») = 0
unlink(«86287687383af5b9c880cd6d4dbaca1c») = 0
unlink(«a8c6a06559e542e396c01a28d6110bbc») = 0
unlink(«ce40f028183e656e1fb5039b8a06dc92») = 0
unlink(«6c66c8ac651afbcd9c3b6dd45a79d506») = 0
unlink(«0753b1f1fcadc9262f0705c897350846») = 0
unlink(«a76ec71296a85087c5e76c413c92e23b») = 0
unlink(«66d65eba60a15d3e44b4058c763dbe74») = 0
— SIGINT (Interrupt) @ 0 (0) —
Process 933 detached
——————
Удаляем огромное количество файлов в директориях файловых систем Linux
Не знаю как вы, а я уже который раз сталкиваюсь с огромным количеством файлов в каталогах. Существует несколько решений как можно их удалить. Кто то пишет свои мини программки, кто придумывает хитрые скрипты. Мы ничего придумывать не будем используем всем известные, но возможно забытые способы.
1. Вполне юзабельно если в каталоге меньше 100к файлов.
find /your/directory/ -type f -exec rm -v {} \;
find /your/directory/ -type f -delete -print
cd /your/directory/ ; ls -f . | xargs -n 100 rm
rsync -av --delete empty_dir /your/directory/
Учтите, что все будет позаимствовано с директории empty_dir и владелец тоже.
Лично мне по нраву 3 и 4 способ, они проявили себя очень неплохо, так же для ленивых и аккуратных можно использовать Midnight commander с каталогами до 1 миллиона файлов справляется.
UPD 05.11.2015
Сегодня вновь столкнулся с подобной проблемой, все выше перечисленные способы не помогли, пришлось воспользоваться программой из статьи на хабре [ http://habrahabr.ru/post/152193/ ]
Листинг:
#define _GNU_SOURCE #include /* Defines DT_* constants */ #include #include #include #include #include #include #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) struct linux_dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; }; #define BUF_SIZE 1024*30 int main(int argc, char *argv[]) int fd, nread; char buf[BUF_SIZE]; struct linux_dirent *d; int bpos; int deleted; char d_type; char temp[100]; fd = open(argc > 1 ? argv[1] : ".", O_RDONLY bpos += d->d_reclen; } } printf("deleted %d\n", deleted); exit(EXIT_SUCCESS); }
Если хотите что бы за раз удалялось гораздо больше файлов, измените константу #define BUF_SIZE 1024*30. Я 30 изменил на 100 и вместо 768 файлов за раз стало удаляться по 2560.