Посчитать количество файлов каждого вида в каталоге
От: alien3128  
Дата: 05.04.15 08:12
Оценка:
Нужно написать скрипт на bash, считающий количество скриптов каждого вида в заданной директории. Разновидность файла определяется по сигнатуре в первой строке (#!/usr/bin/perl, #!/bin/bash etc.)
Подозреваю, что это должно делаться в одну строчку, что-то вроде цепочки команд ls | grep | awk, но дальше не могу сообразить.
Re: Посчитать количество файлов каждого вида в каталоге
От: smeeld  
Дата: 05.04.15 12:09
Оценка:
Здравствуйте, alien3128, Вы писали:

A>Нужно написать скрипт на bash, считающий количество скриптов каждого вида в заданной директории. Разновидность файла определяется по сигнатуре в первой строке (#!/usr/bin/perl, #!/bin/bash etc.)


perl="perl"; sh="sh"; bash="bash"; PERL=0; BASH=0; SH=0; DIR="/usr/bin"; MAS=`ls $DIR`; for file in $MAS; do if [ -f $DIR/$file ]; then tmp=`sed -n '{s/^#!.*\///g p}' $DIR/$file`; case $tmp in $sh) let SH=$SH+1 ;; $bash) let BASH=$BASH+1;; $perl) let PERL=$PERL+1;; esac;fi; done; echo "RES SH=$SH, BASH=$BASH, PERL=$PERL"
Re: Посчитать количество файлов каждого вида в каталоге
От: Anton Batenev Россия https://github.com/abbat
Дата: 05.04.15 12:28
Оценка: +1
Здравствуйте, alien3128, Вы писали:

a> Нужно написать скрипт на bash, считающий количество скриптов каждого вида в заданной директории. Разновидность файла определяется по сигнатуре в первой строке (#!/usr/bin/perl, #!/bin/bash etc.)

a> Подозреваю, что это должно делаться в одну строчку, что-то вроде цепочки команд ls | grep | awk, но дальше не могу сообразить.

Если у всех файлов есть данный маркер, то грубое решение:

$ find . -maxdepth 1 -type f -print0 | xargs -r -0 -I {} head -n 1 {} | sort | uniq -c | sort -n
avalon/1.0.442
Re[2]: Посчитать количество файлов каждого вида в каталоге
От: alien3128  
Дата: 05.04.15 19:12
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>Здравствуйте, alien3128, Вы писали:


a>> Нужно написать скрипт на bash, считающий количество скриптов каждого вида в заданной директории. Разновидность файла определяется по сигнатуре в первой строке (#!/usr/bin/perl, #!/bin/bash etc.)

a>> Подозреваю, что это должно делаться в одну строчку, что-то вроде цепочки команд ls | grep | awk, но дальше не могу сообразить.

AB>Если у всех файлов есть данный маркер, то грубое решение:


AB>
$ find . -maxdepth 1 -type f -print0 | xargs -r -0 -I {} head -n 1 {} | sort | uniq -c | sort -n


Спасибо. В первом приближении вроде то, что нужно. Но. У perl скриптов, например, могут быть разные ключи (или не быть вообще).
А если еще считать бинарники (т.е файлы с сигнатурой ELF) ?
Re[3]: Посчитать количество файлов каждого вида в каталоге
От: Anton Batenev Россия https://github.com/abbat
Дата: 05.04.15 19:30
Оценка:
Здравствуйте, alien3128, Вы писали:

a> AB>Если у всех файлов есть данный маркер, то грубое решение:

a> AB>$ find . -maxdepth 1 -type f -print0 | xargs -r -0 -I {} head -n 1 {} | sort | uniq -c | sort -n
a> Спасибо. В первом приближении вроде то, что нужно. Но. У perl скриптов, например, могут быть разные ключи (или не быть вообще).

Можно оставить только первую левую часть (если имя скрипта не имеет пробелов):

$ find . -maxdepth 1 -type f -print0 | xargs -r -0 -I {} head -n 1 {} | awk '{ print $1; }' | sort | uniq -c | sort -n


a> А если еще считать бинарники (т.е файлы с сигнатурой ELF) ?


Здесь наверное уже не так просто, но исполняемые бинарники можно посчитать по биту исполнения или по расширению .so, .a, .o
avalon/1.0.442
Re[3]: Посчитать количество файлов каждого вида в каталоге
От: watchmaker  
Дата: 05.04.15 20:48
Оценка:
Здравствуйте, alien3128, Вы писали:

A>А если еще считать бинарники (т.е файлы с сигнатурой ELF) ?

Есть утилита file, которая по списку файлов возвращает их тип: картинка, видео, исполняемый модуль, библиотека, скрипт и на каком языке, и так далее — этим куда удобнее пользоваться чем head -n1.

A>В первом приближении вроде то, что нужно. Но. У perl скриптов, например, могут быть разные ключи (или не быть вообще).

Это далеко не единственная проблема. Например shebang #!/usr/bin/env perl тоже задаёт интерпретатор перла (да и такая форма записи встречается часто, так как предпочтительнее указания полного пути, которого может и не существовать на другом компьютере). А есть ещё и символьные ссылки, например.

В общем, тут тебе самому нужно решать, что считать одним и тем же, а что — нет.
Например, если указан интерпретатор python, то это то же самое, что и python2? А python2.5? А python3? С одной стороны всё это описывается словом "питон", с другой стороны различия в скриптах велики. Никакая утилита за тебя не решит, важны эти отличия для тебя или нет. Аналогично и с параметрами для интерпретатора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.