Как я могу использовать счетчик слов ( wc
) и трубопровод, чтобы подсчитать, сколько файлов или каталогов в /usr/bin
каталоге?
scripting
find
wc
file-types
денежные средства
источник
источник
Ответы:
Один из подходов состоит в том, чтобы использовать
ls
для предоставления нам список файлов, но мы хотим, чтобы этот список гарантированно отображал только 1 файл или каталог на строку.-1
Выключатель будет делать это для нас.пример
Создайте приведенные выше примеры данных в пустом каталоге.
Проверь это:
Теперь для подсчета вы можете использовать
wc -l
для подсчета количества строк, которые соответствуют файлу или каталогу вls -1
выводе.(обратите внимание, однако, что он не включает скрытые файлы)
Подсчет файлов или каталогов, только не вместе
Для подсчета файлов или каталогов вам нужно немного изменить свою тактику. В этом случае я бы использовал,
ls -l
поскольку он показывает, что такое каталог и что такое файл.пример
Затем мы можем использовать
grep
для фильтрации каталогов или не-каталогов следующим образом:Теперь просто используйте еще
wc -l
раз для подсчета выше:Хотя, вы можете избежать в
wc
целом, и использованияgrep
«s-c
варианта:(опять же, скрытые файлы не включены. Обратите внимание, что каталоги и обычные файлы - это два типа файлов. Есть много других, таких как именованные каналы, символические ссылки, устройства, сокеты ...).
Рекурсия
Если вам нужно рекурсивно находить файлы и каталоги,
/usr/bin
то вы, вероятно, захотите полностью изменить тактику и использовать другой инструмент под названиемfind
.пример
(хотя над
/usr/bin
собой входит в счет)Те же методы, которые я использовал выше, могут быть использованы
ls
дляls
создания чего-то похожего, но, как правило, не являются хорошим инструментом для анализа выходных данных.find
с другой стороны, был создан для этого и предлагает переключатели для поиска файлов или каталогов.(обратите внимание, что в этот раз
find
включаются скрытые файлы (кроме.
и..
)).строки?
Я никогда не понимал, почему символ новой строки является допустимым символом, который следует использовать при создании имен файлов или каталогов. Таким образом, методы, рассмотренные выше, используют
wc
иls
не будут противоречить этим, поэтому используйте их с учетом этого.пример
Создайте каталог и имя файла с символами новой строки.
ls
показывает их правильно:Но
wc
считает каталоги и файлы, которые содержат переводы строк, как 2 элемента, а не как один.Один из способов обойти это, если используется реализация GNU
find
- это использоватьfind
возможность печатать что-то еще вместо каждого файла, который он находит, а затем подсчитывать их.пример
Здесь мы находим все в текущем каталоге ( за исключением
..
), и печать точка (.
) для каждого, а затем подсчет точек , используяwc
способность «s для подсчета байт вместо строк,wc -c
.Ссылки
источник
/usr/bin
будут хорошо отформатированы (и также не будут содержать пробелов, так что технически вы могли бы даже простоecho * | wc -w
), стоит отметить, что все они будут ломаться на именах файлов, содержащих символы новой строки.ls -l
илиls -1
мы сломаемся, потому что мы считаем строки, а не слова!find
Может сломаться, но опять же , мы рассчитываем строки не слово.touch $'foo\nbar'
в пустом каталоге, за которым следует одна из ваших команд (скажемls -1 | wc -l
), будет отчет о двух файлах, а не об одном - потому что этот файл состоит из двух строкwc
. Если неls
заменить символы новой строки каким-либо другим символом (я не думаю, что это так, но опять же я не в состоянии проверить прямо сейчас).wc -c
это проблема при подсчете периодов?Если вы хотите получить рекурсивную разбивку числа файлов каждого типа под некоторым каталогом, с помощью GNU
find
, вы можете сделать:В
/usr/bin
моей системе это дает:На
/dev
:Для символических ссылок, если вы предпочитаете считать их типом файла, на который они указывают, а не его
symbolic links
, вы можете изменить его на:Который сейчас дает для моего
/usr/bin
:(неработающая символическая ссылка - это символическая ссылка на файл, для которой
find
невозможно определить тип, либо потому, что файл не существует, либо находится в каталоге, к которому у вас нет доступа, либо в разрешении пути к файлу есть цикл В моем случае те 2, где символические ссылки на файлы, которые сейчас ушли).Никто из тех не считается
.
и..
. Если вы хотите, чтобы они были включены (почему вы?), Нет другого пути,find
кроме как предположить, что они есть для каждого каталога и подсчитывать их систематически:Который затем дает на моем
/usr/bin
:Если у вас нет доступа к GNU
find
, вы можете переписать первый как:Теперь, строго говоря, мы не считали файлы, а только записи в каталогах . Каталог, как
/usr/bin
правило, имеет несколько записей, которые указывают на один и тот же файл. Например, здесь у меня есть:Это 3 записи каталога (или имена файлов или жесткие ссылки) к одному и тому же файлу (с индексом 672252. Для подсчета файлов вместо записей каталога и с помощью GNU
find
и GNUuniq
(игнорирование.
и..
файлы, которые в любом случае являются жесткими ссылками на другие каталоги):По моему
/usr/bin
, это дает:источник
Вы не сказали, хотите ли вы, чтобы все файлы находились в / usr / bin рекурсивно или просто под первым уровнем. Кроме того, как вы собираетесь получить слова, которые вы рассчитываете? Обычный способ узнать это запустить find в wc. Как это: найти / usr / bin | wc -l Find перечислит там все, каталоги и файлы. Wc -l подсчитает все строки в выводе find. Это классное задание? Это нормально, если это так, но мне было интересно, зачем вам нужна эта информация, чтобы я мог более тщательно адаптировать ответ. Пожалуйста, дайте мне знать, если вам нужно больше. ребро
источник
В баш, без внешних инструментов.
В bash, без внешних инструментов и рекурсии.
источник
.
ни..
записи, ни записи. Вы можете хотеть избавиться от неоднозначности файла против обычного файла.