Intereting Posts
Прозрачное проксирование TCP-соединений на порту (в основном, без доступа root) Нет информации о версии? Какие правила определяют отношения между родителями и дочерними процессами, запущенными оболочкой через трубу? Есть ли способ немедленно отключить сброс syslog на диск? Интерактивный брандмауэр для ограничения исходящих запросов Могу ли я приостановить процесс резервного копирования с помощью rsync, umount и отключить резервное хранилище, повторно подключить и смонтировать его и возобновить резервное копирование? проблема чашек с встроенным buildroot Команда для обмена данными в HPUX itanium и HPUX PARISC? Как установить постоянный путь в @INC Как использовать awk для разбиения файла с помощью текстового шаблона Почему каталог / lost + found 16K вместо 4K байтов? Почему «journalctl –disk-using» и «journalctl | wc ”не соответствует хорошо? Как fsnotify влияет на производительность системы? Различные выходы на разные терминалы в Ubuntu Как проводить синхронизацию времени в локальном режиме?

Что такое ./ и ../ каталоги?

Простой вопрос, но я не уверен, где искать, а google не реагирует на периоды и косые черты.

Я просто пытаюсь подсчитать количество файлов и каталогов в текущем каталоге (не включая подпапки / файлы) и пытался отличить ls -1 | wc -l ls -1 | wc -l и ls | wc -l ls | wc -l поскольку они кажутся одинаковыми. Сайт, на который я смотрел, сказал: «Имейте в виду, что это также подсчет каталогов ./ и ../». в отношении одного с ls -1 , и я не уверен, что это означает, что он включает каталоги до или что-то (чего я не хочу), но это не похоже на тестирование.

Может ли кто-нибудь подтвердить, какой из них был бы наиболее подходящим для подсчета количества файлов и каталогов только в текущем каталоге (а не суб), а что они означают в каталогах ./ и ../?

Каждый каталог в системе Unix (и, вероятно, каждая другая система) содержит не менее двух записей каталога. Это так . (текущий каталог) и .. (родительский каталог). В случае корневого каталога они указывают на одно и то же место, но с любым другим каталогом они различны. Вы можете это увидеть сами, используя команды stat , pwd и cd (в Linux):

 $ cd / $ stat . .. bin sbin | grep Inode Device: 802h/2050d Inode: 2 Links: 27 Device: 802h/2050d Inode: 2 Links: 27 Device: 802h/2050d Inode: 548865 Links: 2 Device: 802h/2050d Inode: 2670593 Links: 2 $ pwd / $ cd .. $ pwd / $ 

Обратите внимание, что у bin и sbin есть две ссылки на него. Один из них – это запись каталога в корневой каталог, а другая – . запись внутри этого каталога.

Использование ls с трубой в wc -l – простой трюк для подсчета количества строк в выводе ls. Предполагается, что каждый файл или каталог будет занимать ровно одну строку на выходе. GNU ls будет, когда вывод не является терминалом, сделает это автоматически; другим может понадобиться опция -1 чтобы включить поведение явно. wc -l просто подсчитывает и выводит количество строк ( -l ) на своем входе.

Проблема с этим подходом заключается в том, что в Linux и на файловых системах, традиционно используемых в Linux, имена файлов и каталогов (они действительно одно и то же в этом отношении) могут содержать символы новой строки . При наличии этих методов любой метод разваливается – эти записи будут считаться двумя или более записями, если на самом деле они одни.

Пока вы используете GNU ls, не имеете записей в каталоге с именами, содержащими символы новой строки, и не имеете нечетных псевдонимов для ls (например, ls -a ), оба выводят количество файлов и каталогов в текущем (или указанном ). Для большинства людей это достаточно хорошо, но в общем случае оно недействительно.

Если вам нужно обрабатывать необычные символы (в первую очередь символы новой строки) в именах записей в каталоге правильно, я предлагаю использовать опцию -b чтобы избежать их. ls -1bA будет печатать каждое имя записи каталога в своей строке, избегая необычных символов (поэтому каждая запись в каталоге будет рассматриваться как одна), включая любые dotfiles и -directories. Tack on wc -l для полной командной строки ls -1bA | wc -l ls -1bA | wc -l который будет сообщать количество файлов и каталогов в текущем каталоге (но игнорировать . и .. ; это разница между -a и -A ), но не спускаться в какие-либо подкаталоги. Если вы не хотите, чтобы какие-либо dotfiles были подсчитаны по отношению к сумме, просто опустите параметр -A в ls .

Чтобы ответить на вопрос в теме:

Когда каталог B создается в Unix, он добавляется как новая запись в другой каталог A (его родительский каталог), а в B добавляются две записи: одна называется . как жесткая ссылка на себя, и одна называется .. как жесткая ссылка на А.

Это единственные жесткие ссылки на разрешенные каталоги (хотя некоторые более старые версии некоторых Unices также допускают произвольные ссылки).

поэтому в большинстве файловых систем ( btrfs является заметным исключением) количество links в каталоге – это показатель количества подкаталогов, которые он имеет (с учетом их записей).

Когда вы переименовываете / перемещаете каталог, если он находится в том же каталоге (под другим именем), изменяется только запись имени в A B. и .. не влияет. Но если вы переместите его на другой каталог, то .. в B изменится. Это объясняет, почему вы можете переименовать каталог, в котором у вас нет доступа на запись (при условии, что у вас есть доступ на запись к родительскому каталогу) только до тех пор, пока вы не переместите его в другой каталог (в противном случае необходимо изменить .. вход запрещает вам перемещать его).

Остерегайтесь: /a/b/../c может не совпадать с /a/c поскольку /a/b может быть символической ссылкой на какой-либо другой каталог.

Исключением является то, когда этот путь передается команде cd некоторым оболочкам. Эти cd s лечат .. логически игнорируя записи .. в каталогах. Причина, почему вы часто видите cd -P в правильно написанных сценариях, чтобы отключить эту функцию, которая в противном случае могла бы вызвать путаницу и несоответствия.

Чтобы подсчитать количество записей в текущем каталоге, исключая . и .. с помощью bash , вы можете сделать:

 shopt -s nullglob dotglob set -- * echo "$#" 

С zsh:

 f=(*(ND)) echo $#f 

Портабельно:

 find . ! -name . -prune -print | grep -c / 

Я не большой эксперт по Linux, но я знаю Linux (раньше был администратором 16 лет назад, на Slackware 🙂 доброе старое время

директории ./ и ../ просто:. это текущий каталог, .. является предыдущим каталогом (в дереве pwd -local directory command-

Если он их подсчитает, я считаю, что они добавляют 2 к общему количеству листинга, а не идут рекурсивно и подсчитывают каталог ниже текущего, а также снова подсчитывают текущий каталог (.) :))

Поэтому в основном я думаю, что он добавляет значение 2, чтобы уже считать (файлы) в текущем каталоге.

Кто-нибудь исправит меня, если я ошибаюсь.

Я просто публикую, чтобы помочь, и увидел, что никто не ответил на этот вопрос здесь, они могут быть заняты. Но просто экспериментируйте и посмотрите, есть ли у вас 10 файлов и получите счет 12, вот и все.