web-dev-qa-db-ja.com

パッケージから(ディレクトリではなく)ファイルのみのリストを取得するにはどうすればよいですか?

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の出力をlsxargsでパイプしても、ディレクトリをフィルターで除外できないようです。

7
mydoghasworms

単純に ループdpkg -L elixirの各行にわたって テスト その行が 通常のファイル のパスであるかどうか、次にecho それ:

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

findのアイデアは良さそうですが、find

  1. stdinを受け入れず、
  2. 指定された単一のパスのプロパティを確認するだけで、指定されたパスを検索します。

したがって、ここでは適切なツールではありません。

11
Melebius

xargsに加えて、シェルテストで可能になるはずです。たとえば、

dpkg -L elixir | xargs sh -c 'for f; do [ -d "$f" ] || echo "$f"; done'
11
steeldriver

Perl onelinerを使用:

dpkg -L elixir | Perl -nE 'chomp; say unless -d'
  • dpkg -Lは、パッケージ内のすべてのファイル/ディレクトリをリストし、stdoutに出力します
  • Perl -nEは、次のPerlコードをdpkg出力の各行で反復し、現在の行をデフォルトの引数変数($_と呼ばれる)のままにします
  • chompstdinから末尾の改行を削除し、デフォルトの引数変数($_)にファイル名のみを残します。
  • saysay $_の省略形であり、次の条件に該当する場合、stdoutデフォルト引数に出力されます。
  • unless -dunless -d $_の省略形)は、以前のsayの条件であり、指定されたファイル名がディレクトリでない場合にのみtrueになることを意味します

したがって、ディレクトリではないすべてのファイル名が表示されます。ディレクトリのみを表示したい場合は、unlessifに置き換えます。または、シンボリックリンクのみが必要な場合は、-lなどの代わりに-dを使用できます(詳細については、man perlfuncを参照してください)。

3
Matija Nalis

別のオプションは、ファイルのdpkgの出力とfindの結果を比較することです。

comm -12 \
   <(dpkg -L kate | sort ) \
   <(find $( dpkg -L kate ) -maxdepth 1 -type f | sort )
3
Fiximan