найти файл с помощью «найти» и показать размер файла [дубликат]

Как я могу найти файл одновременно с просмотром размера файла? ОШИБКА: я попробовал эту команду, но получил только размер и информацию о других файлах.

find -name "*.conf" | ls -l
5
задан 21 May 2018 в 18:04

4 ответа

find имеет a -ls опция. Таким образом, Ваша команда должна быть похожей на это:

find -name '*.conf' -ls
12
ответ дан 23 November 2019 в 08:38

Опция, указывают Ваш собственный формат с -printf. Например, это произведет размер файла, сопровождаемый пространством затем имя файла (с относительным путем):

find -name "*.conf" -printf "%s %p\n"

Можно закончить строку формата \0 вместо \n если Вы захотите NUL-разделить выходные записи находки, то в случае Вы ожидаете забавные имена файлов (например, те, которые включая новые строки).


Для записи не работает попытка, показанная в Вашем вопросе, потому что Вы пытаетесь передать вывод по каналу от find вводить к ls. ls не читает входа из STDIN, таким образом, вывод от find просто отбрасывается и затем ls перечисляет содержание текущего каталога, как обычно.

7
ответ дан 23 November 2019 в 08:38

Другие ответы уже указали

  1. как распечатать размер файла с find только, использование -printf
  2. как добраться ls вывод с find только, использование -ls
  3. как правильно передать по каналу findвывод к другой программе с xargs

Однако первый и второй подход не дает точный вывод ls -l ( -ls флаг равняется ls -dils) и третьему нужно дополнительное xargs звонить. С помощью -exec флаг возможно звонить ls -l непосредственно от find:

find -name "*.conf" -exec ls -l {} +

Это дает целый список имен файлов как аргументы ls -l и вызовы это так же так же много раз по мере необходимости.


Если Вы просто хотите соответствовать каждому файлу, заканчивающемуся в .conf в и под текущим каталогом (и ARG_MAX не проблема!), Вам на самом деле не нужно find вообще. Вместо этого можно использовать bashшарик, соответствующий globstar и dotglob опции оболочки следующим образом – это достаточно одинаково мудро не повредиться на новых строках в именах файлов и соответствует “скрытым” файлам как find:

$ shopt -s globstar dotglob
$ ls -l **/*.conf
4
ответ дан 23 November 2019 в 08:38

ls не добирается его список файлов из стандарта ввел, он ожидает, что они будут аргументами. xargs команда является общим средством для того, чтобы превратить вход в аргументы:

find -name '*.conf' | xargs ls -l

Однако это разделит вход в пробеле, таким образом, у Вас смогут быть проблемы, если какое-либо из имен имеет пробелы. find и xargs имейте опции, которые сотрудничают для смягчения этого:

find -name '*.conf' -print0 | xargs -0 ls -l

-0 опция к xargs говорит этому использовать пустой байт в качестве разделителя между параметрами во входе, и -print0 говорит find распечатать имена, разделенные пустым байтом вместо новой строки.

3
ответ дан 23 November 2019 в 08:38

Другие вопросы по тегам:

Похожие вопросы: