Подтвердить что ты не робот

Unix: быстрый "удалить каталог" для ежедневной очистки

Есть ли более быстрый способ удалить каталог, а затем просто отправить

rm -r -f *directory*

? Я спрашиваю об этом, потому что наши ежедневные кросс-платформенные сборки действительно огромны (например, 4 ГБ на сборку). Таким образом, жесткие диски на некоторых машинах часто выходят из космоса.

Это относится к нашим платформам AIX и Solaris.

Может быть, есть специальные команды для удаления каталогов на этих платформах?

PASTE-EDIT (переместил мой отдельный ответ в вопрос):

Мне вообще интересно, почему 'rm -r -f' так медленно. Не нужно "rm" просто изменять ".." или ".". файлы для деактивации записей файловой системы.

что-то вроде

mv *directory* /dev/null

было бы хорошо.

4b9b3361

Ответ 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.

Ответ 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