#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
?