Давайте посмотрим здесь ...
выбрать все обычные файлы (не каталоги или ссылки)
До сих пор вы не обращались к этому, но если вы пипетируете вывод ls -l...
, это просто, выберите
/^-/
потому что каталоги начинаются с d
, символические ссылки с l
и так далее. Только простые старые файлы начинаются с -
. Теперь
распечатать количество файлов, за которыми следует
Ну, подсчет матчей достаточно прост ...
BEGIN{count=0} # This is not *necessary*, but I tend to put it in for clarity
/^-/ {count++;}
Чтобы получить имя файла и размер, посмотрите на вывод ls -l
и сосчитайте столбцы
BEGIN{count=0}
/^-/ {
count++;
SIZE=$5;
FNAME=$9;
}
Большая трудность здесь в том, что awk
не дает большого количества возможностей для сортировки примитивов, так что это сложная часть. Это может быть побеждено , если вы хотите быть умным, но это не особенно эффективно (см. Ужасную вещь, которую я сделал в решении [code-golf] ). easy (и unixy) нужно сделать так, чтобы часть вывода выводилась в sort
, поэтому ... мы собираем строку для каждого файла в большую строку
BEGIN{count=0}
/^-/ {
count++
SIZE=$5;
FNAME=$9;
OUTPUT=sprintf("%10d\t%s\n%s",SIZE,FNAME,OUTPUT);
}
END{
printf("%d files\n",count);
printf(" SIZE \tFILENAME"); # No newline here because OUTPUT has it
print OUTPUT|"sort -n --key=1";
}
Дает вывод как
11 files
SIZE FILENAME
673 makefile
2192 houghdata.cc
2749 houghdata.hh
6236 testhough.cc
8751 fasthough.hh
11886 fasthough.cc
19270 HoughData.png
60036 houghdata.o
104680 testhough
150292 testhough.o
168588 fasthough.o
(Кстати - здесь есть подкаталог test
, и вы заметите, что он не отображается в выходных данных.)