我一直在尝试使用 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'