пример Bash-скрипта или команды для извлечения числовых файлов из каталога

#linux #shell

#linux #оболочка

Вопрос:

У меня проблема с количеством файлов в каталоге

Я использую

 $(ls /test -l | grep '^-' | wc -l)
  

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

   /test/1
  /test/1/2
  /test/1/3
  /test/1/4/1
  /test/1/4/2
  /test/1/5
  

мой вопрос в том, как получить количество файлов в / test?
Спасибо за совет.

Ответ №1:

попробуйте это

 targetDir=/test
find ${targetDir} -type f | wc -l
  

Я надеюсь, что это поможет.

Ответ №2:

 $(ls -lR /test | grep '^-' | wc -l)
  

Лучше использовать find

 $(find /test -type f | wc -l)
  

Ответ №3:

стандартный способ заключается в использовании find

find /test -type f | wc -l

Другие методы включают использование командной оболочки (например, bash 4)

 shopt -s globstar
shopt -s dotglob
declare -i count=0
for file in **
do
  if [ -f "$file" ];then
     ((count  ))
  fi
done
echo "total files: $count"
  

Или языка программирования, такого как Perl / Python или Ruby

 ruby -e 'a=Dir["**/*"].select{|x|File.file?(x)};puts a.size'
  

Комментарии:

1. Вам не нужно создавать массив только для определения его размера: count = Dir["**/*"].inject(0) {|c,x| File.file?(x) ? c 1 : c}; puts count

2. @glenn, да, я действительно хотел это изменить, но подумал оставить статус-кво, поскольку он уже получил ответ. Однако, в мою защиту было бы то, что мы можем использовать массив позже, при желании 🙂

Ответ №4:

Использование wc -l — самый простой способ, но если вы хотите точно подсчитать файлы, это сложнее:

 count_files()
{
    local file_count=0
    while IFS= read -r -d '' -u 9
    do
        let file_count=$file_count 1
    done 9< <( find "$@" -type f -print0 )
    printf %d $file_count
}
  

В качестве бонуса вы можете использовать это для одновременного подсчета в нескольких каталогах.

Чтобы протестировать это:

 test_dir="$(mktemp -d)"
touch "${test_dir}/abc"
touch "${test_dir}/foo
bar
baz"
count_files "$test_dir"
  

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить, почему wc -l является неточным, когда ему предшествует find . -type f ?