Простой вопрос, но я не уверен, где искать, и Google не реагирует на периоды и косые черты.
Я просто пытаюсь подсчитать количество файлов и каталогов в текущем каталоге (не включая подпапки / файлы) и пытался различить, ls -1 | wc -l
и, ls | wc -l
поскольку они кажутся идентичными. Сайт, на который я смотрел, сказал: «Имейте в виду, что это также подсчет каталогов ./ и ../». ls -1
Что касается одного с , и я не уверен, означает ли это, что он включает в себя каталоги ранее или что-то (что я не хочу), но, похоже, это не было сделано из-за тестирования.
Может ли кто-нибудь подтвердить, какой из них будет наиболее подходящим для подсчета количества файлов и каталогов только в текущем каталоге (не подкаталоге) и что они имеют в виду под каталогами ./ и ../?
Ответы:
Каждый каталог в системе Unix (и, вероятно, в любой другой системе) содержит как минимум две записи каталога. Это
.
(текущий каталог) и..
(родительский каталог). В случае корневого каталога они указывают на то же место, но с любым другим каталогом они отличаются. Вы можете убедиться в этом сами, используя командыstat
,pwd
andcd
(в Linux):Обратите внимание,
bin
и уsbin
каждого есть две ссылки на него. Одна - это запись в корневом каталоге, а другая -.
запись в этом каталоге.Использование
ls
с конвейером вwc -l
- это простой трюк для подсчета количества строк в выводе ls. Предполагается, что каждый файл или каталог будет занимать ровно одну строку в выводе. GNU ls будет, когда вывод не является терминалом, делать это автоматически; другим может понадобиться-1
опция явного включения поведения.wc -l
просто считает и выводит количество строк (-l
) на своем входе.Проблема этого подхода заключается в том, что в Linux и в файловых системах, традиционно используемых в Linux, имена файлов и каталогов (в этом отношении они на самом деле одинаковы) могут содержать символы новой строки . При наличии таковых любой из методов разваливается - эти записи будут считаться двумя или более записями, когда в действительности они равны.
Пока вы используете GNU ls, не имеете записей каталогов с именами, содержащими символы новой строки, и не имеете нечетных псевдонимов для
ls
(например,ls -a
), оба будут выводить количество файлов и каталогов в текущем (или указанном) каталоге. Для большинства людей это достаточно хорошо, но в общем случае оно недопустимо .Если вам нужно правильно обрабатывать необычные символы (в первую очередь, новые строки) в именах записей каталога, я предлагаю использовать
-b
опцию ls, чтобы избежать их.ls -1bA
будет печатать каждое имя записи каталога в отдельной строке, экранируя необычные символы (поэтому каждая запись каталога будет рассматриваться как единое целое), включая любые файлы точек и -директории. Выберитеwc -l
полную командную строку, вls -1bA | wc -l
которой будет указано количество файлов и каталогов в текущем каталоге (но игнорируйте.
и..
; в этом разница между-a
и-A
), но не переходите ни в какие подкаталоги. Если вы не хотите, чтобы какие-либо точечные файлы были засчитаны в общую сумму, просто опустите-A
параметр доls
.источник
-a
и другое-A
включает в себя скрытые файлы, которые, как я понял, я хочу избежать, так что в большинстве случаев я бы хотелls -b | wc -l
, но это дает мне правильный ответ. Неправильная ли строка, которую я скопировал и вставил относительно этой команды? Если это правильно, не должен ли я получить вывод 8, если в каталоге 6 файлов или папок?mkdir()
системного вызова. Не все файловые системы имеют их, и они даже не нужны и не требуются POSIX.Чтобы ответить на вопрос в теме:
Когда каталог B создается в Unix, он добавляется как новая запись в другой каталог A (его родительский каталог), а в B добавляются две записи: одна называется
.
жесткой ссылкой на себя, а другая..
- жесткой ссылка на А.Это единственные разрешенные жесткие ссылки на каталоги (хотя в некоторых старых версиях некоторых Unices также допускались произвольные ссылки).
вот почему в большинстве файловых систем (
btrfs
что является заметным исключением), номерlinks
каталога является показателем того, сколько у него подкаталогов (учитывая их..
записи).Когда вы переименовываете / перемещаете каталог, если он находится в том же каталоге (под другим именем),
A
изменяется только запись имени в . B.
и..
не влияет. Но если вы двигаетесь это сделать другой каталог, то..
вB
изменится. Это объясняет, почему вы можете переименовывать каталог, для которого у вас нет прав на запись (при условии, что у вас есть доступ на запись в родительский каталог), только если вы не перемещаете его в другой каталог (в противном случае необходимость изменить..
запись предотвращает Вы двигаете это).Но
/a/b/../c
будьте осторожны: может не совпадать с тем,/a/c
что/a/b
может быть символической ссылкой на другой каталог.Исключением является случай, когда этот путь задан
cd
команде для некоторых оболочек. Те логическиcd
обрабатывают игнорирование записей в каталогах. Причина, по которой вы часто видите в правильно написанных сценариях отключение этой функции, которая могла бы вызвать путаницу и несоответствия...
..
cd -P
Чтобы подсчитать количество записей в текущем каталоге, исключая
.
и..
с помощьюbash
, вы можете сделать:С зш:
Портабельно:
источник
ls | wc -l
это единственный исключающий.
и..
ls
не показывает список скрытых файлов. Вы должныls -A
получить так же, как те. Если вы не хотите считать скрытые файлы, снимитеdotglob
(для bash) илиD
(для zsh) или добавьте! -name '.*'
перед-print
дляfind
.ls | wc -l
прежнему дает мне правильный ответ и исключает скрытые файлы,.
&..
?.
,..
и другой файл, имя которого начинается с.
которой не указана Л.С. , но будет поls -A
. Такls | wc -l
что не дает вам правильный ответ, потому что он не считает этот скрытый файл..
и..
это скрытые файлы, так как они начинаются с.
. Есть даже легенда, объясняющая, что точечные файлы скрыты случайно, так как ранняя реализацияls
должна была исключать только.
и..
, но была ошибка, из-за которой исключался любой файл, начинающийся с.
.ls | wc -l
не работает, если имена файлов содержат символы новой строки.Я не большой эксперт по Linux, но я знаю Linux (раньше был администратором 16 лет назад, на Slackware :), доброе старое время
каталоги ./ и ../ это просто:. является текущим каталогом, .. является предыдущим каталогом (в дереве каталога pwd -local команда-
Если он их считает, я считаю, что они добавляют 2 к общему количеству листингов, на самом деле не идут рекурсивно, подсчитывают каталог ниже текущего, а также снова считают текущий каталог (.) :))
Так что в основном я думаю, что это добавляет значение 2 к количеству (файлам) в текущем каталоге.
Кто-нибудь поправит меня, если я ошибаюсь.
Я просто пишу, чтобы помочь и увидел, что никто не ответил на этот вопрос здесь, они могут быть заняты. Но просто поэкспериментируйте и посмотрите, есть ли у вас 10 файлов и получите счет 12, вот и все.
источник
ls | wc -1
ls | wc -l
включает.
и..
когда я получаю правильный ответ, в отличие от правильного ответа + 2.