您find
可以通过文件属性进行搜索-type
,例如-executable
等。
如何从现有文件列表中实现类似的功能?例如 的输出dpkg -L <package_name>
。
管道 tols -ld
或file
then togrep
既不精确也不正确。
我认为awk
可以用来解析 的输出ls -ld
以获得准确的结果,但这似乎过于复杂并且不是真正的通用解决方案。最好的情况是find
它本身可以用于此目的。
答案1
尝试:
stat --printf="'%n' is a %F\n" $(dpkg -L grep)
如果您只想显示目录,您可以这样做:
stat --printf="'%n' is a %F\n" $(dpkg -L grep) | grep ' is a directory$'
或者
for f in $(dpkg -L grep)
do
operms=$(stat --format='0%a' "$f")
if [ $(( $operms & 0111 )) -ne 0 ]
then
echo "$f: executable";
fi
done
可能性是无止境!
我认为前两种形式通常更理想,因为它们只启动两个进程;然而,循环为每个文件for
启动一个进程。stat
请参阅stat
手册第 1 节中的手册页,了解可以通过这种方式访问的所有属性。
感谢@Jeff-Schaller 的提及stat
。
答案2
您可以test
以相当类似的方式使用,find
例如
dpkg -L somepackage | while read -r f; do [ ! -d "$f" -a -x "$f" ] && printf "$f\n"; done
为了find ! -type d -executable
答案3
您可以使用我的dlocate
包与-lsbin
选项:
例如
$ dlocate -lsbin gawk
/usr/bin/gawk
/usr/bin/igawk
/usr/lib/x86_64-linux-gnu/awk/grcat
/usr/lib/x86_64-linux-gnu/awk/pwcat
xargs ls -l
如果你想要一个长列表,你可以将其输入。
我写了dlocate
一个包装等等dpkg
来完成所有这些本身无法完成的grep-dctrl
小事情。dpkg
它的搜索速度也比dpkg -s
.
dlocate
debian 档案中的当前版本确实进行了邪恶的解析ls
,这在特定的上下文中相对安全。到目前为止尚未发布的更新使用stat
...我可能会完成它的工作,并在今年年底之前将其上传到 debian。
顺便说一句,dlocate
还有(除其他外)-du
、-lsconf
、-lsman
和-md5check
选项。
例如
$ dlocate -lsman gawk
/usr/share/man/man1/gawk.1.gz
/usr/share/man/man1/igawk.1.gz
/usr/share/man/man3/filefuncs.3am.gz
/usr/share/man/man3/fnmatch.3am.gz
/usr/share/man/man3/fork.3am.gz
/usr/share/man/man3/inplace.3am.gz
/usr/share/man/man3/ordchr.3am.gz
/usr/share/man/man3/readdir.3am.gz
/usr/share/man/man3/readfile.3am.gz
/usr/share/man/man3/revoutput.3am.gz
/usr/share/man/man3/revtwoway.3am.gz
/usr/share/man/man3/rwarray.3am.gz
/usr/share/man/man3/time.3am.gz
您可以将其直接输入xargs man
并逐个阅读手册页。
$ dlocate -lsman gawk | xargs man