В дополнение к ответу Gilles - пока Вы не намереваетесь сделать ioctls на файле, это - просто поток. Таким образом, если Вы работали от гостя
# mkfifo /dev/fakevideo0
# ssh host cat /dev/video0 > /dev/fakevideo0
/dev/fakevideo0 будет вести себя как буфер поэтому, если Вы будете читать из него, то Вы получите поток от камеры.
Как насчет этого приема?
find . -maxdepth 1 -exec echo \; | wc -l
Столь же портативный как find
и wc
.
С ударом, без внешних утилит, ни циклов:
shopt -s dotglob
files=(*)
echo ${#files[@]}
В ksh, замене shopt -s dotglob
FIGNORE=.?(.)
. В zsh, замена это setopt glob_dots
, или удалите shopt
назовите и используйте files=(*(D))
. (Или просто отбросьте строку, если Вы не хотите включать точечные файлы.) Портативно, если Вы не заботитесь о точечных файлах:
set -- *
echo $#
Если Вы действительно хотите включать точечные файлы:
set -- *
if [ -e "$1" ]; then c=$#; else c=0; fi
set .[!.]*
if [ -e "$1" ]; then c=$((c+$#)); fi
set ..?*
if [ -e "$1" ]; then c=$((c+$#)); fi
echo $c
1
для пустого каталога, когда nullglob
не включен. В zsh, a=(*(DN));echo ${#a}
с N
(nullglob
) спецификатор не приводит к ошибке для пустого каталога.
– nisetama
12.05.2016, 02:17
Yoc может использовать такую конструкцию:
I=0; for i in * ; do ((I++)); done ; echo $I
Но я боюсь, Вы можете католическая ошибка как Argument list too long.
в случае, если у Вас есть слишком много файлов в каталоге. Однако я протестировал его на каталоге с 10 миллиардами файлов, и это работало хорошо.
*
.
– Lekensteyn
23.12.2011, 13:53
for
. А-ч
– enzotib
23.12.2011, 18:16
Попытка:
ls -b1A | wc -l
-b
будет иметь непечатаемые символы, -A
покажет все файлы кроме .
и ..
и один на строку (значение по умолчанию на канале, но хороший, чтобы быть явным).
Пока мы включаем высокоуровневые языки сценариев, вот острота в Python:
python -c 'import os; print len(os.listdir(os.sep))'
Или с полной 'находкой':
python -c 'import os; print len([j for i in os.walk(os.sep) for j in i[1]+i[2]])'
Вы рассмотрели жемчуг, который должен быть относительно портативным?
Что-то как:
use File::Find;
$counter = 0;
sub wanted {
-f && ++$counter
}
find(\&wanted, @directories_to_search);
print "$counter\n";
Попробуйте это => Используя ls с-i (для числа узла), и-F (добавляет имя каталога с '/'), опции.
ls -ilF | egrep -v '/' | wc -l
find . ! -name . -prune -print | grep -c /
должно быть довольно портативно к системам после 80-х годов.
Это подсчитывает все записи каталога, кроме .
и ..
в текущем каталоге.
Чтобы подсчитать файлы в подкаталогах, а также:
find .//. ! -name . | grep -c //
(что нужно быть портативным даже до Unix V6 (1975), поскольку ему не нужно -Prune
)
С однострочником perl
(переформатирован для удобства чтения):
perl -e 'opendir($dh, ".");
while ( readdir($dh) ) {$count++};
closedir $dh;
print "$count\n";'
или
perl -e 'opendir($dh, ".");
@files = readdir($dh);
closedir $dh;
print $#files+1,"\n";'
Вы можете использовать функции perl
, которые изменяют массивы, например grep
или карта
со второй версией. См. perldoc -f readdir
для примера использования grep
.
В дополнение к основанному наfind
-ответу , предложенному Стефаном , вот ответ, совместимый с POSIX -, основанный наls
:
ls -qf | tail -n +3 | wc -l
Самая простая версия, которую я использую постоянно и с которой у меня никогда не было проблем, это :
ls -b1 | wc -l
n+1
файлы в моей системе Debian). Это также не фильтрует для регулярных файлов. – Chris Down 23.12.2011, 15:35find
управляйте к своим определенным потребностям. Да, этот включает все каталоги, включая.
(который мог бы быть, почему Вы видите результат какn+1
). – rozcietrzewiacz 23.12.2011, 17:35find . -maxdepth 1 ! -name . -exec echo \; | wc -l
; некоторые более старые версииfind
не иметь-not
. – Arcege 23.12.2011, 18:50-maxdepth
не является стандартным (расширение GNU, теперь также поддерживаемое несколькими другими реализациями). – Stéphane Chazelas 09.05.2015, 18:10