Как получить список только файлов (не каталогов) из пакета?

Используя dpkg -L <package name>, я могу получить список всех файлов из пакета, но он также содержит список каталогов, которые я хочу исключить.

Так, например:

dpkg -L elixir

дает мне:

/.
/usr
/usr/bin
/usr/lib
/usr/lib/elixir
/usr/lib/elixir/bin
/usr/lib/elixir/bin/elixir
/usr/lib/elixir/bin/elixirc
/usr/lib/elixir/bin/iex
/usr/lib/elixir/bin/mix
/usr/lib/elixir/lib
/usr/lib/elixir/lib/eex
/usr/lib/elixir/lib/eex/ebin
/usr/lib/elixir/lib/eex/ebin/Elixir.EEx.Compiler.beam
(etc...)

Я пытался исключить каталоги со следующим:

dpkg -L elixir |  find  -maxdepth 1 -not -type d

Но это просто дает файл в текущем каталоге.

Соединение вывода dpkg с ls с xargs также не позволяет мне отфильтровывать каталоги.

7
задан 30 May 2019 в 01:02

4 ответа

Просто переберите каждую строку в dpkg -L elixir и проверьте, является ли линия путем к обычному файлу , а затем echo это:

while read f; do [ -f "$f" ] && echo "$f"; done < <(dpkg -L elixir)

Ваша идея с помощью [ 113] выглядит хорошо, но find

  1. не принимает stdin и
  2. выполняет поиск по заданному пути, в то время как вы хотите просто проверить свойства одного заданного пути,
  3. [ 118]

    , так что здесь не тот инструмент.

0
ответ дан 30 May 2019 в 01:02

Другим вариантом было бы сравнить выходные данные dpkg с результатами find для файлов:

comm -12 \
   <(dpkg -L kate | sort ) \
   <(find $( dpkg -L kate ) -maxdepth 1 -type f | sort )
0
ответ дан 30 May 2019 в 01:02

Это должно быть возможно с xargs и тестом оболочки, например,

dpkg -L elixir | xargs sh -c 'for f; do [ -d "$f" ] || echo "$f"; done'
.
0
ответ дан 30 May 2019 в 01:02

С остротой жемчуга:

dpkg -L elixir | perl -nE 'chomp; say unless -d'
  • dpkg -L перечислит все файлы/каталоги в пакете и произведет его к stdout
  • perl -nE выполнит итерации следующего кода жемчуга по каждой строке dpkg вывод, оставляя текущую строку в переменной параметра по умолчанию (названной $_)
  • chomp удаляет запаздывание перевода строки из stdin, таким образом оставляя только имя файла в переменной параметра по умолчанию ($_).
  • say коротко для say $_, который распечатает к stdout параметру по умолчанию, если следующее условие будет верно.
  • unless -d (короткий для unless -d $_) условие для предыдущего say, и средства, это только будет верно, если указанное имя файла не будет каталогом

Так, это отобразит все имена файлов, которые не являются каталогами. Если бы Вы хотели отобразить только каталоги, то Вы заменили бы unless с if. Или если бы Вы хотели только символьные ссылки, то Вы могли бы использовать -l вместо -d, и т.д. (см. man perlfunc для получения дополнительной информации)

3
ответ дан 30 May 2019 в 01:02

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

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