1

Я пытаюсь найти в файловой системе все файлы, соответствующие расширению (*.what), а затем сосчитать все файлы в каталоге, где были найдены файлы *.what . Вывод должен содержать имя каталога и имена файлов с количеством.

Как это может быть сделано?

4 ответа4

4

Сначала вы должны использовать команду find в терминале.

find . -type f -name "*.what"

Это перечислит все файлы в системе из текущего каталога "." соответствие «тип: файл» и имя «*. what».

Таким образом, вы можете включить это в скрипт bash, например так:

редактировать

Вот, пожалуйста, это делает то, что вы хотите, я думаю.

#!/bin/bash

src=${1:-"."}
ext=${2:-"what"}

for dir in `find ${src} -type f -name "*.${ext}"`; do
    dir=`echo ${dir} | awk 'BEGIN{FS=OFS="/"}{$NF=""}{print}'`
    echo ${dir} "has" `ls -l ${dir} | awk '!NR=1 && !/^d/ && !/*.what/ {print $NF}' | wc -l` "file(s)"
done

Это выведет количество файлов в любых каталогах, которые содержат * .what (рекурсивно). Число файлов исключает каталоги !/^d/ и файл *. what !/*.what/ .

Это должно привести вас туда. По крайней мере, работает в моей системе, если я понимаю вопрос.

1

Попробуйте этот конвейер:

find -name '*.what' -exec dirname {} \; | sort | uniq -c
0
$ cat tmp/example.awk
{
   a[$1]++
} END {
   for (i in a) {
     dir=i; gsub(" ", "\\ ", dir) ;
     printf "echo %s: %d; cd %s; ls -1 *htm; cd ->/dev/null; echo\n", \
        i, a[i], dir, dir
   }
}

Образец вывода:

find . -iname "*.htm" -printf "%h\t%f\n" |sort |\
    awk -F'\t' -f tmp/example.awk |sh
(...)
./fpsu/applikasjon/kjerne/lib: 1
xom-1.0b5.htm

./tmp/refcp/refcp/home/jaroslav/reference/programing/input-processing: 1
Capitalizing+personal+names.htm

./Downloads/index files: 3
allclasses-frame.htm
overview-frame.htm
overview-summary.htm

./tmp/refcp/refcp/home/jaroslav/reference/code/html-css/common-web-fonts_files: 6
hostedbadge_002.htm
hostedbadge_003.htm
hostedbadge.htm
like_002.htm
like_003.htm
like.htm
(...)

Первым шагом является печать каждой папки и имени файла с заданным расширением. Это достигается с помощью аргументов% h% t для поиска printf.

Следующим шагом является подсчет каждой записи в данной папке с [$ 1]++ в программе awk. То есть для каждой напечатанной строки мы увеличиваем запись массива с индексом, равным имени найденного каталога, содержащего файлы с заданным суффиксом.

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

В результате получается список команд оболочки, которые мы передаем в sh .

-1
find -name *.c|grep -c .c

это найдет количество элементов с расширением .c

find -name *.c 

отобразит структуру каталогов элементов с расширением .c

!/bin/bash

find -name *$1|grep -c $1
find -name *$1

сохраните это как list.sh в /home /yourname /bin

Chmod +x list.sh
chown {username} list.sh

называть это где угодно списком * .extension

Пример list *.c

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .