Эти повышение:: библиотека program_options хороша, если Вы находитесь в C++ и имеете роскошь использования Повышения.
Самый быстрый вариант удаления каталога из файловой системы - 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"
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
По крайней мере, в AIX вы должны использовать LVM, менеджер логических томов. Все наши системы объединяют все физические жесткие диски в одну группу томов, а затем создают из этого одну большую файловую систему.
Таким образом, вы можете добавлять физические устройства к своей машине по желанию и увеличивать размер файла
Еще одно решение, которое я видел, - это выделить корзину для мусора в каждой файловой системе и использовать комбинацию mv
и find
cron
, чтобы решить проблему с пространством.
По сути, имейте задание cron
, которое запускается каждые десять минут и выполняет:
rm -rf /trash/*
rm -rf /filesys1/trash/*
rm -rf /filesys2/trash/*
Затем, когда вы хотите, чтобы ваш конкретный каталог в этой файловой системе был переработан, используйте что-нибудь например:
mv /filesys1/overnight /filesys1/trash/overnight
и в течение следующих десяти минут ваше дисковое пространство начнет восстанавливаться.
Я думаю, что на самом деле нет ничего, кроме "rm -rf", как вы цитировали, для удаления ваших каталогов.
чтобы не делать это вручную снова и снова, вы можете ежедневно cron скрипт, который рекурсивно удаляет все каталоги сборки корневого каталога сборки, если они «достаточно стары», например:
find <buildRootDir>/* -prune -mtime +4 -exec rm -rf {} \;
(здесь mtime +4 означает «любой файл старше 4 дней).
Другой способ - настроить ваш Builder (если он позволяет такие вещи) разрушить предыдущую сборку текущей.
rm -r каталог
работает путем рекурсивного перехода в глубину вниз по каталогу , удаления файлов и удаление каталогов на обратном пути. Это необходимо, так как вы не можете удалить каталог, который не пуст.
Длинные, скучные подробности: каждый объект файловой системы представлен индексным дескриптором в файловой системе, который имеет плоский массив индексов в масштабах всей файловой системы. [1] Если вы просто удалили каталог без предварительного удаления его дочерних элементов, дочерние элементы останутся выделенными, но без каких-либо указателей на них. ( fsck
проверяет такие вещи при запуске, поскольку это означает повреждение файловой системы.)
[1] Это может быть не совсем верно для каждой файловой системы, и может существовать файловая система, которая работает так, как вы описываете. Возможно, потребуется что-то вроде сборщика мусора. Однако все известные мне действуют как объекты fs, принадлежащие индексным дескрипторам, а каталоги представляют собой списки пар имя / номер индексного дескриптора.
поскольку это представляет собой повреждение файловой системы.)[1] Это может быть не совсем верно для каждой файловой системы, и может существовать файловая система, которая работает так, как вы описываете. Возможно, потребуется что-то вроде сборщика мусора. Однако все известные мне действуют , как будто объекты fs принадлежат индексным дескрипторам, а каталоги представляют собой списки пар имя / номер индексного дескриптора.
поскольку это представляет собой повреждение файловой системы.)[1] Это может быть не совсем верно для каждой файловой системы, и может существовать файловая система, которая работает так, как вы описываете. Возможно, потребуется что-то вроде сборщика мусора. Однако все известные мне действуют как объекты fs, принадлежащие индексным дескрипторам, а каталоги представляют собой списки пар имя / номер индексного дескриптора.