ksh: необходимо быстро и надежно удалить несколько каталогов - PullRequest
1 голос
/ 05 мая 2010

У меня много каталогов, и мне нужно периодически их удалять с минимальным временем. Кроме того, для каждого каталога необходимо удалить статус, т. Е. Успешно ли он удален или нет. Мне нужно написать на КШ. Не могли бы вы помочь мне.

Пример кода, который я использую, в котором я пытался запустить rm-rf в фоновом режиме, не работает.

for var1 in 1...10
rm -rf <DIR> &
pid[var1]=$!
done

my_var=1
for my_var in 1...var1
wait $pid[my_var]
if [ $? -eq 1 ]
then
  echo falied
else
 echo passed
fi
done

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Вам не повезло. Узким местом здесь является файловая система, , и вы вряд ли найдете файловую систему, которая выполняет атомарные операции (например, удаление каталога) в параллельно . Никакие хлопоты с шелл-кодом не заставят ОС или файловую систему работать быстрее. Существует только один диск, и если для каждого удаления требуется запись на диск, он будет медленным.

Лучше всего перейти на файловую систему журналирования, которая быстро удаляет файлы. Мне повезло с удалением XFS больших файлов (10-40 ГБ) быстро, но я не пробовал удалять каталоги. В любом случае, ваш путь к повышению производительности заключается в поиске правильной файловой системы, а не подходящего сценария оболочки.

0 голосов
/ 05 мая 2010

Обычно это форма, которую должен принимать ваш скрипт, с исправлениями серьезных ошибок в синтаксисе. Однако, как заметил Norman , он не будет делать то, что вы хотите. Кроме того, wait не будет работать в цикле, как вы, похоже, намереваетесь.

# this script still won't work
find . -type d | while read dir
# or: for dir in ${dirs[@]}
do
    rm -rf $dir &
    pid[++var1]=$!
done

for my_var in {1...$var1}
do
    wait ${pid[my_var]}
    if [ $? -eq 1 ]
    then
        echo failed
    else
        echo passed
    fi
done
...