как я могу получить количество файлов в каталоге с помощью командной строки?

<p>у меня есть каталог с большим количеством файлов. я не вижу переключателя <code>ls</code> для подсчета. есть ли какая-то магия командной строки, чтобы получить количество файлов?</p>

<p>используя широкое определение "файла"</p><pre><code>ls | wc -l </code></pre><p>(обратите внимание, что он не считает скрытые файлы и предполагает, что имена файлов не содержат символов новой строки).</p><p>включить скрытые файлы (кроме <code>.</code> а также <code>..</code>) и во избежание проблем с символами новой строки канонический путь:</p><pre><code>find . ! -name . -prune -print | grep -c / </code></pre><p>или рекурсивно:</p><pre><code>find .//. ! -name . -print | grep -c // </code></pre>

<p>для узкого определения файла:</p><pre><code> find . -maxdepth 1 -type f | wc -l </code></pre>

<pre><code>ls -1 | wc -l </code></pre><p>...</p><pre><code>$ ls --help | grep -- ' -1' -1 list one file per line ...$ wc --help | grep -- ' -l' -l, --lines print the newline counts </code></pre><p>ps: примечание ls - <номер-один> | туалет - <буква-л></p>

<p>я нашел <code>du --inodes</code> полезно, но я не уверен, какая версия <code>du</code> требуется. он должен быть значительно быстрее, чем альтернативные подходы, использующие <code>find</code> и <code>wc</code>.</p><p>на ubuntu 17.10 работает следующее:</p><pre><code>du --inodes # all files and subdirectories du --inodes -s # summary du --inodes -d 2 # depth 2 at most </code></pre><p>объединить с <code>| sort -nr</code> для сортировки по убыванию по количеству содержащихся inode.</p>

<p>вероятно, наиболее полный ответ с использованием пары <code>ls</code>/<code>wc</code></p><pre><code>ls -aq | wc -l </code></pre><p>если вы хотите считать точечные файлы, и</p><pre><code>ls -q | wc -l </code></pre><p>в противном случае.</p><ul> <li><code>-a</code> - считать точечные файлы, но пропустить <code>.</code> а также <code>..</code>.</li> <li><code>-q</code> make <code>ls</code> заменяет неграфические символы, особенно символы новой строки, на <code>?</code>, выводя 1 строку для каждого файла</li> </ul><p>чтобы получить однострочный вывод из <code>ls</code> в терминале (то есть без передачи его в <code>wc</code>), <code>-1</code> опция должна быть добавлена.</p><p>(поведение <code>ls</code> протестировано с coreutils 8.23)</p>

<p>если вы знаете, что текущий каталог содержит хотя бы один не скрытый файл:</p><pre class="lang-bsh prettyprint-override">\_<code>set -- *; echo "$#" _это очевидно обобщается на любой шар.в сценарии это иногда вызывает нежелательный побочный эффект перезаписи позиционных параметров. вы можете обойти это, используя subshell или с помощью функции (версия bourne/posix), например:<pre class="lang-bsh prettyprint-override">_count_words () { eval 'shift; '"$1"'=$#' } count_words number_of_files  echo "there are $number\_of\_files non-dot files in the current directory" </code>\_</pre><p>альтернативное решение - <code>$(ls -d --  | wc -l). если глобус __, команда может быть сокращена до $(ls | wc -l)</code>. анализ выходных данных <code>ls</code> всегда делает меня неловким, но здесь это должно работать, пока ваши имена файлов не содержат символов новой строки или ваш <code>ls</code> избегает их. и <code>$(ls -d --  2>/dev/null | wc -l) имеет то преимущество, что корректно обрабатывает случай несовпадающего глобуса (т. е. возвращает 0 в этом случае, тогда как метод _set _ требует тщательного тестирования, если глобус может быть пустым) ,.если имена файлов могут содержать символы новой строки, альтернативой является использование $(ls -d ./* | grep -c /)</code>.</p><p>любое из тех решений, которые полагаются на передачу расширения глобуса в <code>ls</code>, может завершиться с ошибкой <em>список аргументов слишком длинный</em>, если имеется много подходящих файлов.</p>

<p>при использовании пары ls/wc, если мы добавим -u, это будет намного быстрее (не сортируйте).</p><pre><code>ls -aqu | wc -l </code></pre>

<p>после установки команды дерева, просто наберите:</p><p><code>tree</code></p><p>если вы хотите скрытые файлы тоже:</p><p><code>tree -a</code></p><p>если вы используете debian/mint/ubuntu linux, введите следующую команду, чтобы установить команду дерева:</p><p><code>sudo apt-get install tree</code></p><p>опция -l используется для указания максимального уровня отображения дерева каталогов. команда дерева не только подсчитывает количество файлов, но и количество каталогов, учитывая столько уровней дерева каталогов, сколько вам нужно.</p>

<pre><code>find -maxdepth 1 -type f -printf . | wc -c </code></pre><ul> <li><code>-maxdepth 1</code> сделает его нерекурсивным, <code>find</code> по умолчанию рекурсивным</li> <li><code>-type f</code> будет включать только файлы</li> <li><code>-printf .</code> это приятное прикосновение. он печатает точку для каждого файла вместо имени файла, и теперь он может обрабатывать любое имя файла, а также сохраняет данные; нам просто нужно посчитать точки :)</li> <li><code>| wc -c</code> подсчитывает символы</li> </ul>

<p>без трубы, без копирования строк, без форка</p><pre class="lang-bsh prettyprint-override"><code>$ fcount() { local f i=0; for f in ; do let i++; done; echo $i; }; fcount </code></pre>

<p>в linux, чтобы сделать команду очень надежной и обрабатывать файлы, в имени которых могут быть символы новой строки, используйте это:</p><pre><code>find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c </code></pre><p>это спасает нас от <a href="https://mywiki.wooledge.org/parsingls">ordeal</a> анализа <code>ls</code> вывода.</p><hr><p>связанные с:</p><ul> <li> <a href="https://unix.stackexchange.com/q/164988/201820">количество элементов с разделителями в файле</a> </li> </ul>

<p>вот еще один прием по аналогии с <a href="https://unix.stackexchange.com/questions/1125/how-can-i-get-a-count-of-files-in-a-directory-using-the-command-line/1133#1133">один из опубликованных жилем</a> :</p><pre><code>word\_count () { local c=("$@"); echo "${#c[@]}"; } file\_count=$(word_count ) который создает массив с 13 923 элементами (если это количество файлов).

find . -type f -maxdepth 1 | wc -l это может перечислить только файлы в текущем каталоге.

улучшение некоторых ответов, приведенных ранее, но на этот раз делать явно.$ tree -l 1 | tail -n 1 | cut -d " " -f 3 </code></pre><p>стоит отметить использование некоторых любимых команд, таких как <code>tail</code> и <code>cut</code>. также обратите внимание, что дерево не доступно по умолчанию. команда выше сначала собирает информацию о каталоге на уровне 1, затем получает последнюю строку <code>tail -n 1</code> где наша цель, и в конечном итоге <code>cut</code>, чтобы взять третье слово.</p><p>например, найти в <code>/</code>:</p><pre><code>/ $ tree -l 1 . ├── 1 ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lost+found ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├── sys ├── tmp ├── usr └── var 20 directories, 1 file / $ tree -l 1 | tail -n 1 20 directories, 1 file / $ tree -l 1 | tail -n 1 | cut -d " " -f 3 1 тогда как насчет того, чтобы узнать количество каталогов?

попробуйте это, я надеюсь, что этот ответ поможет вамecho $((`ls -l | wc -l` -1 )) </code></pre>

<p>вы можете проверить с помощью:</p><pre><code>ls -l | grep -v ^l | wc -l </code></pre>