Чтобы найти общее количество обычных файлов в каталоге $1
и его подкаталогах:
find "$1" -type f -printf "1\n" | wc -l
Чтобы сохранить это число в переменной:
var=$(find "$1" -type f -printf "1\n" | wc -l)
Это будет работать, даже если имена файлов или каталогов содержат пробелы или другие сложные символы.
обсуждение
Давайте рассмотрим эту строку из исходного кода:
for x in `ls -lr $1 | grep "^d" | tr -s ' ' | cut -d ' ' -f 9`;
Во-первых, никогда не следует разбирать ls. Это ненадежно. Вывод ls
меняется с одной версии на другую. Кроме того, из-за способа обработки специальных символов имя, отображаемое с помощью ls
, не обязательно является правильным именем файла или каталога.
Во-вторых, при использовании переменных оболочки, таких как $1
, они должны быть в двойных кавычках. В противном случае на них выполняется разбиение слов и расширение пути, что может привести ко всему набору ошибок.
В-третьих, в такой форме, как:
for x in `...`
оболочка выполнит разбиение слов и расширение имени пути в результате подстановки команды. Это также может привести ко всему множеству ошибок.