如何使用 ls 显示文件类型?

如何使用 ls 显示文件类型?

我不知道是否ls能够显示文件类型列。

快速在线搜索并搜索后,man没有发现这样的功能。它能做到这一点吗?

澄清:如果文件没有扩展名,这将特别有用。

更新

截至 2018-04-28,答案相当有趣,但它们没有提供我想要的内容。更具体地说,

  • file确实提供了实际的文件类型,但它与 集成得不太好ls。具体来说,我使用ls -lhtrpG --group-directories-first --color=always

  • ls -F是一个ls解决方案但是它提供的是符号而不是实际文件类型的列。

因此,我没有将任何答案标记为我正在寻找的答案。

答案1

我认为显示文件类型的最佳方式是使用此命令:

file <filename>

如果要列出目录中所有文件的类型,只需使用:

file *

<code>file *</code> 来自我的计算机的示例

有关参数的更多详细信息,请参阅:

man file

答案2

file绝对是获取所需文件类型信息的正确选择。要将其输出与 的输出相结合,ls我建议使用find

find -maxdepth 1 -type f -ls -exec file -b {} \;

这将查找当前目录下的每个文件,并打印 的输出ls -dils以及 的输出file -b,每行各占一行。示例输出:

  2757145      4 -rw-rw-r--   1 dessert dessert      914 Apr 26 14:02 ./some.html
HTML document, ASCII text
  2757135      4 -rw-rw-r--   1 dessert dessert      201 Apr 13 15:26 ./a_text_file
UTF-8 Unicode text, with CRLF, LF line terminators

但是,因为你不想要文件类型线而是一个文件类型柱子,下面是删除行间换行符的一种方法:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {}" \;

示例输出:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document, ASCII text
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text, with CRLF, LF line terminators

这个新列相当长,因此让我们从第一个逗号开始删掉所有内容:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {} | cut -d, -f1" \;

输出如下:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text

这不太方便,那么怎么样alias?使用文件中的以下行,~/.bash_aliases您只需运行lsf即可获得当前目录的上述输出。

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'

答案3

为了清楚起见,我要指出的是,你可以看到文件类型从基本意义上讲ls,使用-F标志(classify)根据文件名的类型附加一个符号到文件名:

‘-F’
‘--classify’
‘--indicator-style=classify’
     Append a character to each file name indicating the file type.
     Also, for regular files that are executable, append ‘*’.  The file
     type indicators are ‘/’ for directories, ‘@’ for symbolic links,
     ‘|’ for FIFOs, ‘=’ for sockets, ‘>’ for doors, and nothing for
     regular files.

不过,您可以看到,输出的第一个字母中显示的信息稍微不那么隐晦ls -lwjandrea 的回答更详细地描述了这一点。

但我不认为这就是您所说的文件类型。该ls命令不会查看常规文件内部 - 只会查看目录列表(存储文件名)和 inode(存储元数据,包括前面提到的“类型”)。

因此,该ls命令无法显示文件类型,即它是 JPG 图像、二进制文件、文本文件还是某种 LibreOffice 文档,因为它没有这些信息。

为此,singrium 的回答指出,您需要该file命令,它查看文件内容的前 50-100kB 左右以确定其类型。

答案4

这是使用 paste 合并 ls 和 file 命令的两个输出的另一种方法

paste <(ls -dl *) <(file * | cut -d: -f2)

相关内容