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

myd*_*rms 8 command-line apt dpkg find

使用dpkg -L <package name>我能够从一个包中获取所有文件的列表,但它也包含一个目录列表,我想排除它。

因此,例如:

dpkg -L elixir
Run Code Online (Sandbox Code Playgroud)

给我:

/.
/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...)
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下内容排除目录:

dpkg -L elixir |  find  -maxdepth 1 -not -type d
Run Code Online (Sandbox Code Playgroud)

但这只是给出了当前目录中的文件。

dpkg输出管道连接到lswithxargs似乎也不允许我过滤掉目录。

ste*_*ver 11

例如,应该可以xargs加上外壳测试

dpkg -L elixir | xargs sh -c 'for f; do [ -d "$f" ] || echo "$f"; done'
Run Code Online (Sandbox Code Playgroud)


Mel*_*ius 11

只需遍历每一行dpkg -L elixir测试该行是否是常规文件的路径,然后echo它:

while read f; do [ -f "$f" ] && echo "$f"; done < <(dpkg -L elixir)
Run Code Online (Sandbox Code Playgroud)

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

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

所以这不是正确的工具。


Mat*_*lis 5

使用 perl oneliner:

dpkg -L elixir | perl -nE 'chomp; say unless -d'
Run Code Online (Sandbox Code Playgroud)
  • dpkg -L将列出包中的所有文件/目录并将其输出到stdout
  • perl -nE将在每行dpkg输出上迭代以下 perl 代码,将当前行保留在默认参数变量中(称为$_
  • chomp从stdin中删除尾随换行符,从而仅在默认参数变量 ( ) 中保留文件名$_
  • say是 的缩写say $_,如果以下条件为真,它将打印到stdout默认参数。
  • unless -d( 的缩写unless -d $_) 是 previous 的条件say,表示仅当指定的文件名不是目录时才为真

因此,它将显示所有不是目录的文件名。如果您只想显示目录,则可以替换unlessif. 或者,如果您只想要符号链接,您可以使用-l代替 等-dman perlfunc更多详细信息,请参阅 参考资料)