Re: OpenVZ, VServer и полудесяток
On 23-Dec-2007, Alexey Pechnikov wrote:
> > > P.S. Утилита rm отвратительно работают с большим числом файлов в
> > > директории. Я пишу свои скрипты на tcl, которые выполняют то же самое на
> > > несколько порядков быстрее. В то же время ls работает нормально, не знаю,
> > > в чем проблема. > >
> > Кстати да, искал альтернативу rm/ls/mv, неужели лучше писать самому в
> > скриптах ?
> сложностей не составило. Если вы системные скрипты пишете на bash, то я вам
> просто сочувствую. На bash я делаю только скрипты для /etc/init.d/ Временами
> в рассылке пробегают темы о различных извращениях для ценителей bash, но это,
> видно, не для меня, читаю (интересно же) с ужасом :-)
Для init.d bash как раз не рекомендуются, есть специальные шеллы с минимизацией
количества форков при загрузке..
Насчет сочувствия - сочувствую тем кто не читает вообще никакие доки,
даже howto и faq, не умеет пользоваться гуглом и думает что в этом
виноват bash.
Эта проблема есть вообще _везде_ - ограничение на длину команды(без которого было
бы всё _намного_ хуже), ядро эти "*" не понимает, bash заменяет такие
маски на полный список соотв. файлов, длина команды получается адской.
Решение:
find /test/test_10000/ -type f |xargs rm
Немного более кошерно:
find /test/test_10000/ -type f -print0 |xargs -0 rm -f
Вообще это может и сам find:
find /test/test_10000/ -type f -delete
Но xargs более универсальная вещь.
Глубина рекурсии для поиска по умолчанию не ограничена, чтобы не трогать
подкаталоги:
find /test/test_10000/ -type f -maxdepth=1 |xargs rm
Насчет вашего варианта на тикле - он хуже(съест дофига ram, если файлов много),
и явно медленнее решения с find.
и, кстати, на bash, вы могли бы написать аналогично:
cd /test/test_000000/
for f in $(ls )
do
rm "$f"
done
Если не хочеться менять каталог - добавьте путь в ls и rm или
используйте файл:
for f in $(find /test/test_000/ -type f); do rm "$f"; done
Но это очень не эффективно - по форку на файл.
Reply to: