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
でパイプしても、ディレクトリをフィルターで除外できないようです。
xargs
に加えて、シェルテストで可能になるはずです。たとえば、
dpkg -L elixir | xargs sh -c 'for f; do [ -d "$f" ] || echo "$f"; done'
Perl onelinerを使用:
dpkg -L elixir | Perl -nE 'chomp; say unless -d'
dpkg -L
は、パッケージ内のすべてのファイル/ディレクトリをリストし、stdoutに出力しますPerl -nE
は、次のPerlコードをdpkg
出力の各行で反復し、現在の行をデフォルトの引数変数($_
と呼ばれる)のままにしますchomp
はstdinから末尾の改行を削除し、デフォルトの引数変数($_
)にファイル名のみを残します。say
はsay $_
の省略形であり、次の条件に該当する場合、stdoutデフォルト引数に出力されます。unless -d
(unless -d $_
の省略形)は、以前のsay
の条件であり、指定されたファイル名がディレクトリでない場合にのみtrueになることを意味しますしたがって、ディレクトリではないすべてのファイル名が表示されます。ディレクトリのみを表示したい場合は、unless
をif
に置き換えます。または、シンボリックリンクのみが必要な場合は、-l
などの代わりに-d
を使用できます(詳細については、man perlfunc
を参照してください)。
別のオプションは、ファイルのdpkg
の出力とfind
の結果を比較することです。
comm -12 \
<(dpkg -L kate | sort ) \
<(find $( dpkg -L kate ) -maxdepth 1 -type f | sort )