Подсчет файлов в папке без туалета

Я подкачал кабели на видеокарту... простую... замечательно!

3
17.02.2014, 01:03
5 ответов

Это дает count как обнуляют, потому что Вы - инкремент count в подоболочке. По сути, изменения, внесенные в переменную, потеряны.

Вместо этого скажите:

while read -r dir
do  
    count=$(($count + 1))
done < all_files

достигнуть желаемого результата.

Тем не менее парсинг ls никогда не рекомендуется.

6
27.01.2020, 21:10

Можно использовать массив, чтобы содержать имена файлов и исследовать размер массива:

files=( /root/Jamshed/script/* )
echo "${#files[@]}"

Если Вы хотите все файлы рекурсивно:

shopt -s globstar nullglob
files=( /root/Jamshed/script/** )
echo "${#files[@]}"
3
27.01.2020, 21:10

Можно сделать это без парсинга ls вывод или использование wc следующим образом:

cd /root/Jamshed/script
count=0
shopt -s nullglob
for file in * .*[!.]*;do
    count=$(($count+1))
done
echo $count

Объяснение

Шаблон шарика * будет соответствовать всем именам файлов и именам каталогов, не запускающимся с a . и шаблон шарика .*[!.]* будет соответствовать всем именам файлов и именам каталогов, имя которых запускается с a . и содержит по крайней мере один не -. символ (чтобы не считать специальные каталоги . и ..).

1
27.01.2020, 21:10
  • 1
    Это постаралось бы не рассчитывать ... и ..... также. Обратите внимание, что стандартный синтаксис [!.], нет [^.]. Обратите внимание, что в пустом каталоге, это возвратилось бы 2. –  Stéphane Chazelas 16.02.2014, 19:46

Вместо использования [11544]bash

подстановки процесса [11547] можно - с [11548]bash 4. 2[11549] on - используйте [11550]shopt -s lastpipe[11551], чтобы избежать проблемы подоболочки (назначение переменных в дочернем процессе не видно в родительской оболочке).

(Другой способ избежать проблемы подоболочки - использовать

exec

и перенаправлять stdin из файла или heredoc). Если вы настаиваете на использовании [11554]ls[11555], используйте [11556]ls -1Artb[11557].

0
27.01.2020, 21:10

Ваш сценарий отлично работает в ksh, вы также можете изменить первую строку (в Linux пакет ksh должен быть установлен).
#! / Bin / ksh ksh не использует подоболочки в цикле.

0
27.01.2020, 21:10

Теги

Похожие вопросы