我如何从命令行获取这样的列表,包括每个实用程序的版本?它们是否默认位于同一个文件中?
答案1
他们是 [大概] 都一样(gold
有一个额外的版本——请参阅本文结尾)。
但请考虑本答案代码高尔夫的其余部分,以了解提取版本的最佳方法。
dpkg -L binutils | grep "/usr/bin/" | xargs -i sh -c "{} --version"
其功能与 roadmr 的功能基本相同。
dpkg -L binutils | xargs -i sh -c "{} --version 2>/dev/null || exit 0"
尝试运行一切 dpkg -L ...
输出。显然只有可执行文件才会运行,因此我们只需要重定向错误(并忽略xargs
它们)。
dpkg -L binutils | xargs -i bash -c '[[ -x "{}" && -f "{}" ]] && {} --version'
测试我们正在处理可执行文件而不是过滤路径。
sudo apt-get install parallel
dpkg -L binutils | grep /usr/bin/ | parallel {} --version
dpkg -L binutils | parallel {} --version 2>/dev/null
dpkg -L binutils | parallel '[[ -x "{}" && -f "{}" ]] && {} --version'
这次我们使用 GNUparallel
来做同样的方法。parallel
让我们跳过某些不便之处xargs
(比如它不能跳过任何非零退出代码。man parallel
是一篇真正值得一读的文章。
话虽如此,尽管更短,但我的所有示例都会分叉到一个新的 shell(这是不可避免的xargs
,也是 的重点parallel
),所以它们都比 roadmr 的要慢一些。第一个是最快的。
编辑:到目前为止...
sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}')
只有两个叉子(有点),而且作为与 for 循环一样快(但更短)。
编辑:它们实际上并不完全相同。gold
有一个次要版本(1.11),而其他命令没有。
$ sh <(dpkg -L binutils | awk '/bin\// {print $0 " --version"}') | \
grep Binutils | sort -u | column -t
GNU addr2line (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ar (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU assembler (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU c++filt (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU dwp (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU elfedit (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU gold (GNU Binutils for Ubuntu 2.23.52.20130913) 1.11
GNU gprof (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ld (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU nm (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU objcopy (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU objdump (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU ranlib (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU readelf (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU size (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU strings (GNU Binutils for Ubuntu) 2.23.52.20130913
GNU strip (GNU Binutils for Ubuntu) 2.23.52.20130913
答案2
尝试这个:
for util in `dpkg --listfiles binutils |grep "\/usr\/bin\/"`; do
echo -n "$util -> "; echo "" | $util --version
done
这将获取 binutils 包中的所有二进制文件,并使用 --version 参数查询每个文件。我为那些希望在终端中输入的文件回显一个空字符串。