Удаляем огромное количество файлов в директориях файловых систем Linux

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


1. Вполне юзабельно если в каталоге меньше 100к файлов.
rm -rf /your/directory
2. Используем find и 2 способа удаления
Вызываем rm на каждый файл
find /your/directory/ -type f -exec rm -v {} \;
Удаление средствами find
find /your/directory/ -type f -delete -print
3. Используем ls -f и xargs
cd /your/directory/ ; ls -f . | xargs -n 100 rm
4. rsync и синхронизация с пустой директорией.
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 <dirent.h>     /* Defines DT_* constants */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>

#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 | O_DIRECTORY);
    if (fd == -1)
            handle_error("open");
            
    deleted = 0;

    nread = syscall(SYS_getdents, fd, buf, BUF_SIZE);
    
    if (nread == -1)
            handle_error("getdents");

    if (nread != 0) {
        for (bpos = 0; bpos < nread;) {
            d = (struct linux_dirent *) (buf + bpos);

            d_type = *(buf + bpos + d->d_reclen - 1);

            if(d->d_ino && d->d_ino != 22332748 && d->d_ino != 22332761) { // тут я прописал inode самой директории и директории верхнего уровня, чтобы он не пытался удалять файлы "." и ".." - принимаю подсказки, как это сделать лучше
                sprintf(temp,"%s/%s", argv[1], (char *) d->d_name);
                remove(temp);
                deleted += 1;
            }

            bpos += d->d_reclen;
        }
    }
    
    printf("deleted %d\n", deleted);

    exit(EXIT_SUCCESS);
}
Компиляция:
gcc cleardir.c -o cleardir
Использование:
./cleardir mod-tmp2
Если хотите что бы за раз удалялось гораздо больше файлов, измените константу #define BUF_SIZE 1024*30. Я 30 изменил на 100 и вместо 768 файлов за раз стало удаляться по 2560.

Комментарии ()

    Есть вопрос или предложение пиши в Telegram @cloudsv

    MTProto прokси для Telegram

    Прямой эфир

    cloudsv 10 сентября 2020, 13:17
    MySQL Workbench падает при подключении 2
    cloudsv 31 августа 2020, 15:55
    Let's Encrypt это легко и просто 2
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    Алексей 19 июня 2020, 15:06
    Обновление Scala Rider G4 34
    Tmks 24 января 2020, 01:05
    Настройка прокси mtproto для Telegram 50
    cloudsv 26 октября 2019, 20:11
    Linux I/O Scheduler, для кого какой? 2
    alex 26 февраля 2019, 11:28
    Установка и настройка minidlna 1
    Георгий 18 декабря 2018, 09:13
    Пароль от резервной копии Bitrix 2
    cloudsv 31 июля 2020, 00:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 18:45
    Arch Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 11:00
    Arch Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 19:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 31 июля 2019, 00:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 21:29
    Telegram Полезные боты в Telegram 0