2016-12-19 45 views
1

Заявление о проблемах: список вниз по количеству файлов в каталоге. Примечание. Каталог может содержать либо подкаталог, либо файлы, но не оба. Нужно перечислить количество файлов в каталоге. Вот фрагмент кода.Количество файлов в каталогах в unix с использованием рекурсивного подхода

#!/usr/bin/sh 
directory_navigate() 
{ 
    path=$1 
    cd $path 
    dir_count=`ls -l|grep '^d'|wc -l` 
    if [ $dir_count -gt 0 ] 
    then 
     for dir in `ls` 
     do 
      sub_path="$path/$dir" 
      directory_navigate $subpath 
     done 
    else  
     sub_path=`pwd` 
     file_count $sub_path 
     return 
    fi 
} 

file_count() 
{ 
    path=$1 
    cd $path 
    count=`ls|wc -l` 
    echo "Count of files in $path is $count" 
    return 
} 

main() 
{ 
    filepath=/var/prod/data/extract/tbill 
    directory_navigate $filepath 
    return 
} 

main 

Это выдает следующее сообщение об ошибке: рекурсии слишком глубоко

+2

насчет только с помощью 'find'? – Inian

ответ

2

Использование globstar. В bash сделать

shopt -s globstar 
count=0 
for name in /basefolder/** 
do 
[ -f "$name" ] && ((count++)) 
done 
echo "Total files : $count" 

Более простой подход, как это предлагается в комментарии является

find /basefolder/ -type f -printfc | wc -c 

Здесь загвоздка в том, что мы не должны разобрать (и не разбор, мы просто хотим, чтобы рассчитывать) файлы, если нам требуется проанализировать файлы для более сложных требований, ниже приведены некоторые причины не использовать find.

  • Использование find требует, чтобы вам нужно было обнулить нуль каждого файла (т. Е. Использовать -print0).
  • Кроме того, для анализа каждого файла необходимо использовать комбинацию while - read -r -d ' '.
  • Короче говоря, не стоит усилий.

Edit: Если вы хотите иметь каталог-накрест файл подсчета список, сделайте ниже

#!/bin/bash 
shopt -s globstar 
for name in ~/Documents/so/** 
do 
if [ -d "$name" ] 
then 
    count="$(find "$name" -type f -printf c | wc -c)" 
    echo "Total files in $name : $count" 
fi 
done 
+0

В качестве дополнительной заметки globstar доступен только начиная с bash 4.0. Некоторые ОС, такие как MacOS, не будут иметь его по умолчанию и должны будут обновить свою оболочку. – Aserre

+0

@Aserre: Хорошо, я знаю об этом. В op упоминается 'unix' в вопросе, так что, надеюсь, у него есть версия bash> 4.0 – sjsam

+0

MacOS - это Unix-based :) – Aserre