2016-01-24 2 views
1

Готовый продукт предназначен для рекурсивного подсчета всего в указанной директории или текущего, если аргументы не введены. Прямо сейчас я просто пытаюсь заставить его считать что-либо в указанных каталогах. Мне трудно получить последние заявления, чтобы считать что-нибудь вообще. Он будет отображать 0 файлов в каталоге.Подсчет всех пластов/каталогов в указанном каталоге - скрипты bash/shell

Может ли кто-нибудь дать мне какие-либо советы? Я все еще новичок, так что успокойся, спасибо!

#!/bin/bash 
#A shell script program that counts recursively how many directories/files exist in a given directory. 

declare -i COUNT=0 
declare -i COUNT2=0 
#The script will treat COUNT as an integer that is 0 until modified. 
if [ "$#" -eq "0" ] 
    then 

     for i in * 
     do 
      ((COUNT++)) 
     done 
    ((COUNT--)) #This is done because there is always an overcount of 1. 
    echo "There are $COUNT files and/or directories in the current directory here." 
fi 

if [[ -d $1 ]] 
    then 
     for i in $1 
     do 
      ((COUNT++)) 
     done 
    ((COUNT--)) #This is done because there is always an overcount of 1. 
    echo "There are $COUNT files and/or directories in $1." 
fi 

if [[ -d $2 ]] 
    then 
     for i in $2 
     do 
      ((COUNT2++)) 
     done 
    ((COUNT2--)) #This is done because there is always an overcount of 1. 
    echo "There are $COUNT2 files and/or directories in $2." 
fi 
exit 0 
+0

Где вы обрабатываете рекурсию в своем коде? Вы проверили это? – Derlin

ответ

4

Прежде, вы можете делать то, что вы хотите с однострочника:

find . | wc -l 

find . означает «поиск в текущем каталоге и всех его подкаталогах». Поскольку нет другого аргумента, он будет просто перечислить все. Затем я использую трубку и wc, что означает «количество слов». Опция -l означает «выводит только количество строк».

Теперь, для вашего кода, вот несколько советов. Во-первых, я не понимаю, почему вы повторяете свой код три раза (для 0, 1 и 2). Вы можете просто сделать:

dir="$1" 
if [ -z "$dir" ]; then dir="."; fi 

Вы сохраняете значение аргумента командной строки в $ директории и, если ничего не предусмотрено, (-z означает «пустой»), присвоить значение по умолчанию реж.

for i in $1 не будет работать, если $1 - это путь к каталогу. Таким образом, вместо этого, вы можете использовать

for i in $(ls $dir)

Кроме того, в вашем коде, вы не рассчитывайте рекурсивно. Является ли это добровольным или вы не знаете, как действовать?

+0

Я хочу поблагодарить вас за то, что вы показали мне команду find, я никогда с ней не сталкивался. Я должен иметь возможность использовать несколько каталогов и выводить их общие файлы/каталоги, что стало причиной для операторов $ 1 и $ 2 if. И пока я просто пытался добиться каких-либо результатов, рекурсия была следующей! p.s - для рекурсивного поиска я могу использовать: 'для i в $ (ls - R $ dir)'? – slothforest

+0

НЕ ИСПОЛЬЗУЙТЕ выход ls для чего-либо. ls - инструмент для интерактивного просмотра метаданных каталога. Все попытки разобрать вывод ls с кодом нарушены. Globs намного проще и правильнее: '' для файла в * .txt ''. Прочитайте http://mywiki.wooledge.org/ParsingLs –

+0

Никогда не делайте этого: для x в $ (command) или 'command' или $ var. for-in используется для итерации аргументов, а не (выходных) строк. Вместо этого используйте glob (например. * .txt), массивы (например, «$ {names [@]}») или цикл while-read (например, при чтении строки -r). См. Http://mywiki.wooledge.org/BashPitfalls#pf1 и http://mywiki.wooledge.org/DontReadLinesWithFor –

Смежные вопросы