Unix: быстрый "удалить каталог" для ежедневной очистки
Есть ли более быстрый способ удалить каталог, а затем просто отправить
rm -r -f *directory*
? Я спрашиваю об этом, потому что наши ежедневные кросс-платформенные сборки действительно огромны (например, 4 ГБ на сборку). Таким образом, жесткие диски на некоторых машинах часто выходят из космоса.
Это относится к нашим платформам AIX и Solaris.
Может быть, есть специальные команды для удаления каталогов на этих платформах?
PASTE-EDIT (переместил мой отдельный ответ в вопрос):
Мне вообще интересно, почему 'rm -r -f' так медленно. Не нужно "rm" просто изменять ".." или ".". файлы для деактивации записей файловой системы.
что-то вроде
mv *directory* /dev/null
было бы хорошо.
Ответы
Ответ 1
Чтобы удалить каталог из файловой системы, rm - ваш самый быстрый вариант.
На linux иногда мы делаем наши сборки (несколько GB) в ramdisk, и у него действительно впечатляющая скорость удаления:) Вы также можете попробовать разные файловые системы, но в AIX/Solaris у вас может не быть много вариантов...
Если ваша цель состоит в том, чтобы теперь директория $dir пуста, вы можете переименовать ее и удалить ее позже из задания background/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"
Ответ 2
Я забыл источник этого трюка, но он работает:
EMPTYDIR=$(mktemp -d)
rsync -r --delete $EMPTYDIR/ dir_to_be_emptied/
Ответ 3
В AIX, по крайней мере, вы должны использовать LVM, логический диспетчер томов. Все наши системы объединяют все физические жесткие диски в одну группу томов, а затем создают одну большую файловую систему honkin.
Таким образом, вы можете добавлять физические устройства на свой компьютер по своему усмотрению и увеличивать размер вашей файловой системы до того, что вам нужно.
Еще одно решение, которое я видел, - это выделить каталог мусора в каждой файловой системе и использовать комбинацию mv
и find
cron
для решения проблемы пространства.
В принципе, задание cron
выполняется каждые десять минут и выполняется:
rm -rf /trash/*
rm -rf /filesys1/trash/*
rm -rf /filesys2/trash/*
Затем, когда вы хотите, чтобы ваш конкретный каталог в этой файловой системе переработал, используйте что-то вроде:
mv /filesys1/overnight /filesys1/trash/overnight
и в течение следующих десяти минут ваше место на диске начнет восстанавливаться. Каталог filesys1/overnight
будет немедленно доступен для использования даже до того, как удаленная версия будет удалена.
Важно, чтобы каталог мусора был в той же файловой системе, что и каталог, из которого вы хотите избавиться, иначе у вас будет огромная операция копирования/удаления на ваших руках, а не относительно быстрое перемещение.
Ответ 4
Если rm -rf
работает медленно, возможно, вы используете параметр "sync" или аналогичный, который слишком часто записывается на диск. В Linux ext3 с обычными параметрами rm -rf
работает очень быстро.
Один из вариантов быстрого удаления, который будет работать на Linux и, предположительно, также на разных Unixen, - использовать устройство loop, что-то вроде:
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
Программа "дырка" - это та, которую я написал себе, чтобы создать большой пустой файл, используя "отверстие", а не выделенные блоки на диске, что намного быстрее и не использует дисковое пространство, пока оно вам не понадобится. http://sam.nipl.net/coding/c-examples/hole.c
Я только заметил, что GNU coreutils содержит аналогичную программу "truncate", поэтому, если у вас есть это, вы можете использовать это для создания изображения:
truncate --size=$[5*1024*1024*1024] temp.img
Теперь вы можете использовать смонтированное изображение под mnt-temp для временного хранения, для вашей сборки. Когда вы закончите с этим, сделайте это, чтобы удалить его:
sudo umount mnt-temp
rm test.img
rmdir mnt-temp
Я думаю, вы обнаружите, что удаление одного большого файла намного быстрее, чем удаление большого количества маленьких файлов!
Если вы не хотите компилировать мою программу "hole.c", вы можете использовать dd, но это намного медленнее:
dd if=/dev/zero of=temp.img bs=1024 count=$[5*1024*1024] # create a 5Gb allocated file
Ответ 5
Я думаю, что на самом деле нет ничего, кроме "rm -rf", как вы цитировали, чтобы удалить ваши каталоги.
чтобы не делать это вручную снова и снова, вы можете cron ежедневно script, который рекурсивно удаляет все каталоги сборки вашего корневого каталога сборки, если они "достаточно старые" с чем-то вроде:
find <buildRootDir>/* -prune -mtime +4 -exec rm -rf {} \;
(здесь mtime +4 указывает "любой файл старше 4 дней"
Другим способом было бы сконфигурировать ваш строитель (если он позволяет такие вещи) раздавить предыдущую сборку с текущей.
Ответ 6
rm -r directory
работает, рекурсивная глубина - сначала вниз по каталогу, удаляя файлы и удаляя каталоги на пути назад. Это необходимо, поскольку вы не можете удалить каталог, который не является пустым.
Длинные, скучные детали: каждый объект файловой системы представлен inode в файловой системе, которая имеет файловую систему, плоский массив inodes. [1] Если вы просто удалили каталог без первого удаления своих детей, тогда дети останутся выделенными, но без каких-либо указателей на них. (fsck
проверяет, что происходит, когда он запускается, поскольку он представляет собой повреждение файловой системы.)
[1] Это может быть не совсем верно для каждой файловой системы, и может быть файловая система, которая работает так, как вы описываете. Возможно, это потребует нечто вроде сборщика мусора. Тем не менее, все распространенные, которые я знаю о действии как fs-объекты, принадлежат inodes, а каталоги - это списки пар имен /inode number.
Ответ 7
Использование
perl -e 'для (< * > ) {((stat) [9] < (unlink))}'
См. Ссылку ниже:
http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
Ответ 8
Я тоже изучал это.
У меня был каталог с 600 000 + файлами.
rm * не удался, потому что слишком много записей.
find . -exec rm {} \;
был приятным и удалял ~ 750 файлов каждые 5 секунд. Проверял скорость rm через другую оболочку.
Итак, вместо этого я написал короткий script для rm много файлов одновременно. Который получил около ~ 1000 файлов каждые 5 секунд. Идея состоит в том, чтобы поместить столько файлов в команду 1 rm, сколько вы можете повысить эффективность.
#!/usr/bin/ksh
string="";
count=0;
for i in $(cat filelist);do
string="$string $i";
count=$(($count + 1));
if [[ $count -eq 40 ]];then
count=1;
rm $string
string="";
fi
done
Ответ 9
Мне пришлось удалить более 3 000 000 файлов в Windows. Я установил cygwin. К счастью, у меня был весь основной каталог в базе данных. Создан цикл for и основан на записи строки и удалении с использованием rm -rf
Ответ 10
В Solaris это самый быстрый способ, который я нашел.
find /dir/to/clean -type f|xargs rm
Если у вас есть файлы с нечетными путями, используйте
find /dir/to/clean -type f|while read line; do echo "$line";done|xargs rm
Ответ 11
Необходимо удалить 700 Гбайт из десятков каталогов на диске AWS EBS 1 TB (ext3), прежде чем копировать остаток на новый тома XFS объемом 200 Гбайт. Это занимает часы, оставляя этот объем на 100% ва. Поскольку время ввода-вывода на диске и время сервера не являются бесплатными, для каждой директории это занимает всего лишь часть секунды.
где/dev/sdb
- пустой объем любого размера
directory_to_delete =/EBS/вар/TMP/
mount/dev/sdb $directory_to_delete
nohup rsync -avh/ebs//ebs2/
Ответ 12
Я закодировал небольшое приложение Java RdPro (инструмент рекурсивной очистки каталога), который быстрее, чем rm. Он также может удалять целевые каталоги пользователя, указанного в корневом каталоге. Linux для Linux/Unix и Windows. Он имеет как версию командной строки, так и версию GUI.
https://github.com/mhisoft/rdpro