根据文件属性过滤文件列表

根据文件属性过滤文件列表

find可以通过文件属性进行搜索-type,例如-executable等。

如何从现有文件列表中实现类似的功能?例如 的输出dpkg -L <package_name>

管道 tols -ldfilethen 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.

dlocatedebian 档案中的当前版本确实进行了邪恶的解析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

相关内容