[Linux] подсчет количества файлов в папке

alekss

Есть ли какая-нибудь стандартная команда? Можно конечно извратиться и написать что-то типа этого:
ls -l | nl

slonishka

ls | wc -w изврат?

alekss

в общем да... этот метод будет давать ошибку, если есть файлы, в имени которых есть пробел(ы)

nikita270601

ls -1 | wc -l

Ivan8209

> ls -1
Типа, линуксовый ls начал в трубу слать не одной колонкой?
---
"Аллах не ведёт людей неверных."

nikita270601

Оказывается, нет, в трубу шлет одной колонкой. Спасибо, я не знал.

Marinavo_0507

а так будет ошибка, если в имени встречается "\n"
надо /bin/ls -b | wc -l

slonishka

ну да, можно и без -1 тогда.

Ivan8209

Ну, ты много чего не знаешь.
Ты явно не удосужился прочитать man, потому что $(ls | wc -l)
не равно числу файлов в "папке" ${HOME}.
---
"Аллах не ведёт людей неверных."

Ivan8209

-AB
---
"Аллах не ведёт людей неверных."

nikita270601

Зачем -B?

Ivan8209

См. ответ -а.
---
"Аллах не ведёт людей неверных."

nikita270601

Зачем -b я прекрасно понял. А про -B у меня в man'е написано:
-B, --ignore-backups
do not list implied entries ending with ~

slonishka

жесть. тогда ещё и -a наверное нужно

Ivan8209

Это погнутое.
---
"Аллах не ведёт людей неверных."

nikita270601

-A делает то же, что -a, только без "." и "..".

nikita270601

Это погнутое.
Спрашивают про Linux, поэтому, видимо, правильнее всё же -Ab.

Ivan8209

Ну, звиняйте тогда, мне лень лезть смотреть погнутые значения флагов.
Кстати, чем под линуксами заменить mkdep(1)?
Autotools не предлагать, ЭТО изучать не будут.
Думаю, та же участь постигнет и другое средство сильно сложнее mkdep.
Пока что предложил makedepend, но это какой-то отстой.
---
"Аллах не ведёт людей неверных."

nikita270601

В моём Линуксе есть mkdep.

slonishka

если запускать в своей домашней директории, то -bA выдаёт на один .bash_profile~ больше, чем на самом деле.

vall

отвечу в твоём стиле - man gcc

Ivan8209

Ты не пользуешься даже иксами?
---
"Аллах не ведёт людей неверных."

slonishka

там, где проверял — нет

Ivan8209

Если ему передать кучу файлов, он их отработает правильно?
Видел грязный хак, основанный на этом, хак мне не понравился.
---
"Аллах не ведёт людей неверных."

ruler

zgrep -r 'count files' /usr/share/doc/HOWTO/*

vall

правильно

evgen5555

find . -maepth 1 -xtype f | wc

Ivan8209

Подкаталоги уже выведены из состава файлов?
---
...Я работаю антинаучным аферистом...

Marinavo_0507

find . -maepth 1 -path ./\* -printf '\n' | wc -l

Ivan8209

-mindepth не используется из религиозных соображений.
Вообще, хватит извращаться, а то скоро пойдут варианты

echo $$(find . -mindepth 1 -maepth 1 -exec echo "+1" \

---
"Аллах не ведёт людей неверных."

Sebasten

code: echo $$(find . -mindepth 1 -maepth 1 -exec echo "+1" \
Каждый год вижу Контру как всё более и более опытного пользователя find
Как тебе такой вариант?

echo $$(find -maepth 1 -printf +1)-1

Marinavo_0507

а какая максимальная длина у выражения, которое может посчитать $ ?

Sebasten

А хз, но для 73 файлов уже тормозит

ava3443

Ну, звиняйте тогда, мне лень лезть смотреть погнутые значения флагов.
На AIX 5.3 и HPUX 11i/11i v2 тоже надо ls -Ab
Так что это не погнутое. Ну или не только погнутое.

Marinavo_0507

юникс сосёт
получается, для минимальной надёжности и переносимости нужно на perl писать или типа того

perl <<'EOF'
opendir DIR, "." or die "$!";
for ($n=0; $F = readdir DIR; ($F =~ m/^\.\.?$/) || ($n++{};
closedir DIR;
print "$n\n";
EOF

alekss

Если в текущей дирректории есть папочка(-и то этот скрипт посчитает их как файл.
Чтобы совсем все было правильно и выводилось число ФАЙЛОВ нужно писать так:
 
opendir DIR, "." or die "$!";
for ($n=0; $F = readdir DIR; (-d $F) || ($n++{};
closedir DIR;
print "$n\n";

qsk78

Директория — это тоже файл.

alekss

Директория — это тоже файл
Правда? Не знал... Тогда извиняйте. Когда создавал этот тред, предполагал подсчитать число файлов, исключая дирректории.

Ivan8209


$ find . -printf +1
find: -printf: unknown option

---
"Аллах не ведёт людей неверных."

Ivan8209

Кстати, в корневом каталоге твой код работает неправильно.
---
"Аллах не ведёт людей неверных."

Marinavo_0507

неправильно
нужно ещё пропускать '.' и '..'

Barbie29

ченнить типа этого:
ls -la | grep -v ^d | grep -v "^..$" | grep -v "^.$" | wc -l

alekss

file-tester '-d' будет рассматривать .. и . как дирректории и не будет их считать. Проверял. все работает правильно

Ivan8209

> ls -la | grep -v ^d | grep -v "^..$" | grep -v "^.$" | wc -l
> ls -la
Про -B и -b уже говорили.
Зачем второй и третий грепы непонятно.
Там Махмут что-то про слишком любящих Аллаха говорил...
В общем, нехорошее.
---
"Аллах не ведёт людей неверных."

Sebasten

$ find . -printf +1
find: -printf: unknown option
 $ find --version
GNU find version 4.3.0
Features enabled: O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS

Man
В корневом каталоге твой код работает неправильно

Какого хера? У меня всё пашет.

Ivan8209

> $ find --version
> GNU find version 4.3.0
> Features enabled: O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS

$ find --version
find: unknown option -- -
find: unknown option -- v
find: unknown option -- e
find: unknown option -- r
find: unknown option -- i
find: unknown option -- o
find: unknown option -- n
usage: find [-H | -L | -P] [-hsx] [-f file] [file ...] [expression]

man, man.
---
"Аллах не ведёт людей неверных."

qsk78

В теме сообщения сказано ведь, что Linux.

Sebasten

Удобный man

Ivan8209

В линуксе вообще никак, ибо линукс не ОС.
Там даже sh нет.
---
"Аллах не ведёт людей неверных."

qsk78

Хорошо, есть разные значения Linux: (1) ядро Linux; (2) то, что удовлетворяет LSB; (3) дистрибутив Linux.
Если рассматривать Linux во втором значении, то sh и find там есть. Только find там удовлетворяет POSIX 2003 (с некоторыми отличиями) и о ключе --version там ничего не говорится.
Если рассматривать образцы того, что относят к дистрибутивам Linux, то и sh, и find там есть, и ключ --version у find там работает.
А ОС или не ОС — не важно.

Olenenok

i=0
for file_name in *; do [ -f $file_name ] && i=$$i+1; done
echo $i
Оставить комментарий
Имя или ник:
Комментарий: