Количество файлов в каталогах в 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 

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

1 ответ

Использование 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 ' ' комбинация для разбора каждого файла.
  • Короче, не стоит усилий.

Изменить: Если вы хотите иметь список файлов по каталогам, сделайте ниже

#!/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
Другие вопросы по тегам