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