如何获取包中的文件(而不是目录)列表?

如何获取包中的文件(而不是目录)列表?

使用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

但这仅提供当前目录中的文件。

通过管道将输出传输dpkglswithxargs似乎也不允许我过滤掉目录。

答案1

简单地环形在每一行dpkg -L elixir测试该线是否是常规文件,那么echo它:

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

你的想法find看起来不错,但是find

  1. 不接受标准输入和
  2. 在给定路径中搜索,而您只想检查单个给定路径的属性,

所以它不是适合这里的工具。

答案2

xargs例如,应该可以加上一个 shell 测试

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

答案3

使用 perl 单行命令:

dpkg -L elixir | perl -nE 'chomp; say unless -d'
  • dpkg -L将列出包中的所有文件/目录并将其输出到标准输出
  • perl -nE将在输出的每一行上迭代以下 perl 代码dpkg,将当前行保留在默认参数变量中(称为$_
  • chomp删除尾随换行符标准输入,因此在默认参数变量中只留下文件名($_)。
  • say是缩写say $_,它将打印到标准输出如果以下条件为真,则使用默认参数。
  • unless -d(的缩写unless -d $_)是前一个的条件say,意味着只有当指定的文件名不是目录

因此,它将显示所有非目录的文件名。如果您只想显示目录,则可以用 替换unlessif或者,如果您只想要符号链接,则可以用 代替-l-d。(man perlfunc有关更多详细信息,请参阅)

答案4

另一种选择是将的输出与文件dpkg的结果进行比较:find

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

相关内容