如何在终端上列出文件,以便我们可以看到文件类型,例如可执行文件、ascii 等?

如何在终端上列出文件,以便我们可以看到文件类型,例如可执行文件、ascii 等?

我一直在尝试使用 ls 列出目录中的文件并传递不同的选项。

它也有能力列出文件类型吗?我想知道哪些是可执行文件、共享库文件或只是 ascii 文件,而无需对单个文件执行文件命令。

答案1

ls本身不会显示此信息。

find您可以将to的输出通过管道传输file -f -,如下所示:

$ find /usr/local/bin | file -f -
/usr/local/bin:              directory 
/usr/local/bin/apt:                  Python script, ASCII text executable
/usr/local/bin/mint-md5sum:                          ASCII text
/usr/local/bin/search:                     Bourne-Again shell script, ASCII text executable
/usr/local/bin/gnome-help:                         Python script, ASCII text executable
/usr/local/bin/office-vb.sh:                           ASCII text
/usr/local/bin/pastebin:                       Python script, ASCII text executable
/usr/local/bin/highlight:                        POSIX shell script, ASCII text executable
/usr/local/bin/yelp:                   Python script, ASCII text executable

请注意,find使用 代替,ls因为它将打印完整路径,而ls只会打印文件名。因此,如果您只需要对当前目录中的文件执行此操作,那么:

ls | file -f -

会工作。

答案2

ls不这样做。它的工作是报告文件元数据(权限、时间戳等),而不是文件内容。但file它本身确实如此(与 shell 通配符结合列出所有文件):

file *

对于当前目录,或者

file /some/directory/*

在另一个目录中。

如果要合并元数据和文件内容信息,可以合并ls和的输出file。一种方法是安排两个命令以相同的顺序每行列出一个文件,并使用paste将它们结合起来的实用程序——类似

paste <(ls -dlog -- *) <(file -b -- *)

(这使用进程替换,这在常见的交互式 shell 中可用:bash、zsh,也在 ksh93 中。)如果您有column实用程序,这是对齐列的便捷方法:

paste <(ls -dlog -- *) <(file -b -- *) | column -ts $'\t'

如果您想以不同的顺序输出字段,join而是文件名上的字段。我在空格和制表符之间进行了一些来回操作,以处理包含空格的文件名并生成垂直对齐的结果。

join -t $'\t' -1 2 -2 1 <(ls -dlog -- * |
                          sed 's/^\([^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\)  */\1\t/') \
                        <(file -- * | sed 's/: */\t/') |
column -ts $'\t'

相关内容