Unix: быстро 'удаляют каталог' для чистки ежедневных сборок

Эти повышение:: библиотека program_options хороша, если Вы находитесь в C++ и имеете роскошь использования Повышения.

19
задан 11 February 2010 в 18:54
поделиться

5 ответов

Самый быстрый вариант удаления каталога из файловой системы - rm. В linux мы иногда делаем наши сборки (несколько ГБ) на ramdisk, и у него действительно впечатляющая скорость удаления :) Вы также можете попробовать разные файловые системы, но в AIX / Solaris у вас может быть не так много вариантов ...

Если ваша цель - оставить каталог $ dir пустым сейчас , вы можете переименовать его и удалить позже из фонового задания / cron:

mv "$dir" "$dir.old"
mkdir "$dir"
# later
rm -r -f "$dir.old"

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

# initialization
mkfs.something /dev/device
mount /dev/device "$dir"


# when you want to delete it:
umount "$dir"
# re-init
mkfs.something /dev/device
mount /dev/device "$dir"
23
ответ дан 30 November 2019 в 02:16
поделиться

If rm -rf is slow, perhaps you are using a "sync" option or similar, which is writing to the disk too often. On Linux ext3 with normal options, rm -rf is very quick.

One option for fast removal which would work on Linux and presumably also on various Unixen is to use a loop device, something like:

hole temp.img $[5*1024*1024*1024]  # create a 5Gb "hole" file
mkfs.ext3 temp.img
mkdir -p mnt-temp
sudo mount temp.img mnt-temp -o loop

The "hole" program is one I wrote myself to create a large empty file using a "hole" rather than allocated blocks on the disk, which is much faster and doesn't use any disk space until you really need it. http://sam.nipl.net/coding/c-examples/hole.c

I just noticed that GNU coreutils contains a similar program "truncate", so if you have that you can use this to create the image:

truncate --size=$[5*1024*1024*1024] temp.img

Now you can use the mounted image under mnt-temp for temporary storage, for your build. When you are done with it, do this to remove it:

sudo umount mnt-temp
rm test.img
rmdir mnt-temp

I think you will find that removing a single large file is much quicker than removing lots of little files!

If you don't care to compile my "hole.c" program, you can use dd, but this is much slower:

dd if=/dev/zero of=temp.img bs=1024 count=$[5*1024*1024]  # create a 5Gb allocated file
3
ответ дан 30 November 2019 в 02:16
поделиться

По крайней мере, в AIX вы должны использовать LVM, менеджер логических томов. Все наши системы объединяют все физические жесткие диски в одну группу томов, а затем создают из этого одну большую файловую систему.

Таким образом, вы можете добавлять физические устройства к своей машине по желанию и увеличивать размер файла

Еще одно решение, которое я видел, - это выделить корзину для мусора в каждой файловой системе и использовать комбинацию mv и find cron , чтобы решить проблему с пространством.

По сути, имейте задание cron , которое запускается каждые десять минут и выполняет:

rm -rf /trash/*
rm -rf /filesys1/trash/*
rm -rf /filesys2/trash/*

Затем, когда вы хотите, чтобы ваш конкретный каталог в этой файловой системе был переработан, используйте что-нибудь например:

mv /filesys1/overnight /filesys1/trash/overnight

и в течение следующих десяти минут ваше дисковое пространство начнет восстанавливаться.

5
ответ дан 30 November 2019 в 02:16
поделиться

Я думаю, что на самом деле нет ничего, кроме "rm -rf", как вы цитировали, для удаления ваших каталогов.

чтобы не делать это вручную снова и снова, вы можете ежедневно cron скрипт, который рекурсивно удаляет все каталоги сборки корневого каталога сборки, если они «достаточно стары», например:

find <buildRootDir>/* -prune -mtime +4 -exec rm -rf {} \;

(здесь mtime +4 означает «любой файл старше 4 дней).

Другой способ - настроить ваш Builder (если он позволяет такие вещи) разрушить предыдущую сборку текущей.

2
ответ дан 30 November 2019 в 02:16
поделиться

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

Длинные, скучные подробности: каждый объект файловой системы представлен индексным дескриптором в файловой системе, который имеет плоский массив индексов в масштабах всей файловой системы. [1] Если вы просто удалили каталог без предварительного удаления его дочерних элементов, дочерние элементы останутся выделенными, но без каких-либо указателей на них. ( fsck проверяет такие вещи при запуске, поскольку это означает повреждение файловой системы.)

[1] Это может быть не совсем верно для каждой файловой системы, и может существовать файловая система, которая работает так, как вы описываете. Возможно, потребуется что-то вроде сборщика мусора. Однако все известные мне действуют как объекты fs, принадлежащие индексным дескрипторам, а каталоги представляют собой списки пар имя / номер индексного дескриптора.

поскольку это представляет собой повреждение файловой системы.)

[1] Это может быть не совсем верно для каждой файловой системы, и может существовать файловая система, которая работает так, как вы описываете. Возможно, потребуется что-то вроде сборщика мусора. Однако все известные мне действуют , как будто объекты fs принадлежат индексным дескрипторам, а каталоги представляют собой списки пар имя / номер индексного дескриптора.

поскольку это представляет собой повреждение файловой системы.)

[1] Это может быть не совсем верно для каждой файловой системы, и может существовать файловая система, которая работает так, как вы описываете. Возможно, потребуется что-то вроде сборщика мусора. Однако все известные мне действуют как объекты fs, принадлежащие индексным дескрипторам, а каталоги представляют собой списки пар имя / номер индексного дескриптора.

3
ответ дан 30 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: