2016-03-28 7 views
0

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

Я просто не совсем уверен, как осуществить это ,

Первые вещи первых, мы должны установить выделение на пользовательскую папку

#!/bin/sh 
# Script for folder info 
#------------------------------------------- 
WANTEDFOLDER=$PWD 
cd 
cd $1 #Go into the folder (first argument) 
$WANTEDFOLDER/folderinfo.sh 
# ------------------------------------------ 
echo "Selected directory: $PWD" 

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

Так что мне было интересно, как я мог рассчитать среднее количество файлов, находящихся внутри папок указанного каталога.

Для лучшего понимания этого, давайте создадим пример каталог

$ mkdir testdir 
$ cd testdir 
$ mkdir 1 
$ mkdir 2 
$ mkdir 3 
$ cd 1 
$ echo "hello" > wow.txt 
$ cd .. 
$ cd 2 
$ echo "World"; > file.c 
$ echo "file number 2" > twoinone.tex 
$ cd .. 
$ cd 3 
$ echo "zzz" > z.txt 
$ echo "zz2" > z2.txt 
$ echo "zz3" ? z3.txt 

Alright, так что после этого для лучшей иллюстрации, папки выглядеть примерно так

Так первых вещей первых, мы» сделаю find . -type f

Это должно напечатать следующие результаты

./1/wow.txt
./2/file.c
./2/twoinone.tex
./3/z.txt
./3/z2.txt
./3/ z3.txt

Теперь у нас есть 1 файл в каталоге 1, 2 в 2 и 3 в 3. Так сосчитать среднем она составляет (1 + 2 + 3)/3, что приводит к 2.

Это также можно записать в алгоритм

(количество всех уникальных файлов)/(количество всех уникальных каталогов)

Одно дело - рассчитать это в вашей голове, а другое - в реальном сценарии оболочки.

Другими словами, мне нужно каким-то образом преобразовать в сценарий, где он будет подсчитывать количество файлов в определенной папке, хранить их, подсчитывать все вместе, а затем в конце разделить его на количество уникальные каталоги.

Таким образом, чтобы получить количество каталогов, мы должны сделать find . -type d | wc -l

Чтобы получить количество файлов, довольно просто. мы будем просто использовать find . -type f | wc -l

Что я, однако, не знаю, как я могу сохранить эти два значения в переменной, а затем разделить их через друг друга

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

например. echo "Average Number of files: $(find . -type f | wc -l (somehow divide) find . -type d | wc -l)"

Любая идея, как снять этот подвиг?

ответ

2

Возможно, это то, что вы ищете:

echo $(($(find . -type f | wc -l)/$(find . -type d | wc -l))) 
+0

Спасибо, простое и эффективное решение. Не понял, что я просто могу использовать выражение для двух отдельных команд. – Rawrplus

+0

Это '$ ((..))', который позволяет вам делать арифметику. Обратите внимание, что это только арифметика INTEGER, поэтому, если у вас есть 5 файлов в 2 каталогах, она скажет вам, что 2 не 2,5 в среднем. –

+0

Очень верно. Если вы ожидаете результатов non int, вы можете использовать 'dc' или' awk' для вычисления. –

0

1.) Является ли это действительно необходимо, чтобы получить оценку с плавающей запятой среднего числа файлов во всех каталогах? Но вы задали вопрос, так что, по крайней мере, сейчас необходимо решить эту проблему.

#!/bin/bash 

NumFiles=0 

#Loop over all directories in the current location and count the files in each directory 
DirCount=0 
for d in */ 
do 
     FilesInDir=$(\ls -A $d|wc -l) 
     echo "Number of files in directory $d is $FilesInDir" 
     NumFiles=$(($NumFiles+$FilesInDir)) 
     DirCount=$(($DirCount + 1)) 
done 

echo Final number of directories: $DirCount 
echo Total files in directories: $NumFiles 

if [ $DirCount -gt 0 ]; then 
     AvgFiles=$(echo "$NumFiles/$DirCount" | bc -l) 
     echo $AvgFiles 
fi 
Смежные вопросы