Консультация № 187432
04.06.2013, 00:49
126.41 руб.
0 3 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Написать shell-процедуру, которая выполняет действия: в заданном первым параметром каталоге находит все подкаталоги, число простых файлов в которых меньше или равно заданному вторым параметром числу; удаляет найденные подкаталоги; выдает на экран сообщения о каждом удаленном каталоге.

Обсуждение

Неизвестный
04.06.2013, 12:01
общий
это ответ
Здравствуйте, Посетитель - 396844!

Код:

f() {
if [ ! -d "$1" ]; then
echo "directory $1 do not exist" 1>&2
return
fi

case "$2" in
[0-9]) ;;
*)
echo "secont parameter must be digit" 1>&2;
return;;
esac

find $1 -type f |
awk -vOFS=/ -F / '
{
file=$NF;
$NF="";
h[$0]++
}
END {
for (i in h) {
if (h[i] <= '$2') {
print "remove "i"["h[i]"]";
system("rm "i)
}
}
}'
}

f /tmp 2
Неизвестный
05.06.2013, 20:51
общий
Если есть возможность просьба написать без использования awk ( допустимо только применение print) и, по всей видимости, без использования sed и т.д.
Неизвестный
07.06.2013, 23:20
общий
07.06.2013, 23:22
Без awk, на чистом shell
Код:

#!/bin/sh

f() {
if [ ! -d "$1" ]; then
echo "directory $1 do not exist" 1>&2
return
fi

case "$2" in
[0-9]) ;;
*)
echo "secont parameter must be digit" 1>&2;
return;;
esac

cd $1
find . -type f | # ищем все файлы
sort | # сортируем их
sed 's/\(.*\)\/\(.*\)/\2 \1/' | # разбиваем на имя директории и имя файл, переставляя их местами
uniq -cf 1 | # подсчитываем сколько файлов в директории
while read NUM FILE DIR; do # цикл перебора файлов. на входе три поля: количество файлов, имя файла и директория
if [ $NUM -le $2 ]; then # если в директории файлов меньше или равно числа в $2
if [ $DIR = . ]; then # проверяем если это файл в основной директории
rm $FILE # удаляем его
else
rm -r $DIR # если это субдиректория, то удаляем ее
fi
fi
done
}

f $@
Форма ответа