2013-09-16 3 views
7

Скажем, я хочу, чтобы перечислить все php файлы в каталоге, включая подкаталоги, я могу запустить это в Баш:Список всех файлов в директории с определенным расширением

ls -l $(find. -name *.php -type f)

Проблема с этим заключается в том, что если файлов php вообще нет, команда, которая будет выполнена, равна ls -l, в которой перечислены все файлы и каталоги, а не ни одна.

Это проблема, потому что я пытаюсь получить суммарный размер всех php файлов использованием

ls -l $(find . -name *.php -type f) | awk '{s+=$5} END {print s}'

который заканчивается возвращения размер всех записей в том случае, если отсутствуют файлы соответствующий шаблону *.php.

Как я могу защититься от этого события?

+0

Возможный дубликат [Как найти все файлы расширения в каталоге?] (https://stackoverflow.com/questions/4998290/how-to-find-all-file-extensions-in-directory) – jww

ответ

16

Предлагаю вам сначала выполнить поиск файлов, а затем выполнить команду ls -l (или что-то еще). Например, как это:

find . -name "*php" -type f -exec ls -l {} \; 

, а затем вы можете направить выражение awk сделать добавление.

+0

А, спасибо. Я раньше делал «нахожу». -name "* .php" -type f | xargs ls -l', но сталкивается с той же проблемой. – xbonez

+0

В большинстве случаев нет необходимости прокладывать 'xargs' после' find'. Команда 'exec' предоставляет вам эту утилиту. Обратите внимание, что для обращения к имени файла, найденному 'find', необходимо использовать' {} '. – fedorqui

8

Если вы хотите, чтобы избежать parsing ls, чтобы получить общий размер, вы можете сказать:

find . -type f -name "*.php" -printf "%s\n" | paste -sd+ | bc 
+0

Это действительно здорово. Я даже не знал о существовании 'paste' и' bc'. – xbonez

1

Вот еще один способ, с помощью du:

find . -name "*.php" -type f -print0 | du -c --files0-from=- | awk 'END{print $1}' 
+0

круто, я добавил -h to du и получил результаты в MB, только то, что мне нужно. благодаря! –

Смежные вопросы