Что делает «-ls» при использовании «find»?

Согласно man find:

-ls

Истина; Вывести текущий файл в формате ls -dils на стандартный вывод. Количество блоков составляет 1K блоков, если только не установлена ​​переменная окружения POSIXLY_CORRECT, в этом случае используются 512-байтовые блоки. См. Раздел НЕОБЫЧНЫЕ ФИЛЬМЫ для получения информации о том, как обрабатываются необычные символы в именах файлов.

Я не понимаю часть ls -dils.

man ls имеет «сами каталоги -d списков, а не их содержимое».

Рассмотрим папку с тремя файлами .png:

$ ls
01-default.png  02-jungle.png  03-snow.png
$ 

Я получу

$ find . -type f -ls
 12983011     28 -rw-rw-r--   1 dkb    dkb       25964 Mar 10 17:28 ./01-default.png
 12982994     24 -rw-rw-r--   1 dkb    dkb       21857 Mar 10 17:28 ./03-snow.png
 12983031     28 -rw-rw-r--   1 dkb    dkb       25964 Mar 10 17:28 ./02-jungle.png
$

Но, если -ls означает то же самое, что и ls -dils, я должен увидеть что-то похожее с ls -dils, но все, что я получаю, это

$ ls -dils
13631944 4 drwxrwxr-x 2 dkb dkb 4096 Aug 30 21:22 .
$ 

, тогда как ls -ils больше похоже на то, что я получаю с find, используемым с -ls:

$ ls -ils
total 80
12983011 28 -rw-rw-r-- 1 dkb dkb 25964 Mar 10 17:28 01-default.png
12983031 28 -rw-rw-r-- 1 dkb dkb 25964 Mar 10 17:28 02-jungle.png
12982994 24 -rw-rw-r-- 1 dkb dkb 21857 Mar 10 17:28 03-snow.png
$ 

Поэтому мне было интересно, есть ли опечатка на странице man find и действительно ли ls -dils должно быть ls ils в той части, которую я цитировал в верхней части вопроса.

1
задан 30 August 2019 в 19:55

1 ответ

Для каждого файла это находит, find команда с -ls дисплеи действия, что файл в формате, подобном тому, что отобразила бы эта команда, когда Вы заменяете path с путем того файла:

ls -dils path

Это должно сказать это find с -ls подобно выполнению многих команд, которые запускаются с ls -dils, один для каждого файла найден. Это не подобно выполнению этой фактической команды без параметра пути:

ls -dils

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

ls -dils ./*

(Поскольку ls сортирует его вывод, как упомянуто ниже, еще лучшее сравнение было бы многим, отделяются ls -dils ./filename команды, один для каждого filename.)

С теми конкретными файлами вывод является тем же с и без -d. Однако find может найти каталоги. Вы видите различие между ls команды с и без -d опция путем создания каталога и попытки обоих ls -dils ./* и ls -dils ./*. Например:

ek@Cord:~/tmp$ touch a b c
ek@Cord:~/tmp$ mkdir d
ek@Cord:~/tmp$ ls -dils ./*
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./c
 25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ ls -ils ./*
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 ./c

./d:
total 0

Повторить один конкретный важный момент: потому что find с -ls подобно выполнению, многие отделяются ls -dils path команды, это не ведет себя то же как никакой конкретный ls команда. (Это действительно ведет себя несколько так же к ls -dils paths..., где paths... все пути find найденный, но это не все это подобное этому также, потому что ls команда сортирует свой вывод, таким образом, результаты часто появлялись бы в другом порядке.)


Другой способ видеть это состоит в том, чтобы выполнить a find управляйте, чьи результаты включают каталоги с -ls действие, и затем выполненный соответствие find команды, которые используют -exec действие для выполнения фактический ls команды с различными вариантами. Например:

ek@Cord:~/tmp$ find . -ls
54043195528455285      0 drwxrwxrwx   1 ek       ek            512 Aug 30 12:35 .
147774362773104141      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./a
 71213169107810485      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./b
 23080948090377031      0 -rw-rw-rw-   1 ek       ek              0 Aug 30 12:35 ./c
 25051272927352243      0 drwxrwxrwx   1 ek       ek            512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ find . -exec ls -dils {} \;
54043195528455285 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 .
147774362773104141 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./a
71213169107810485 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./b
23080948090377031 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./c
25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 ./d
ek@Cord:~/tmp$ find . -exec ls -ils {} \;
total 0
147774362773104141 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 a
 71213169107810485 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 b
 23080948090377031 0 -rw-rw-rw- 1 ek ek   0 Aug 30 12:35 c
 25051272927352243 0 drwxrwxrwx 1 ek ek 512 Aug 30 12:35 d
147774362773104141 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./a
71213169107810485 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./b
23080948090377031 0 -rw-rw-rw- 1 ek ek 0 Aug 30 12:35 ./c
total 0

В версии, которая работает -ls без -d, первые записи, отображенные для a, b, c, и d вывод первого ls выполненная команда, с путем .. Для проверки этого попробуйте его -ok вместо -exec (который работает в интерактивном режиме, предлагая Вам перед каждой командой, и поэтому ясно дает понять, который команды производят который выводы).

3
ответ дан 3 December 2019 в 07:20

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

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