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


12

对于是否ls能够显示文件类型列,我一无所知。

快速进行在线搜索并搜索man并没有显示出这种功能。有能力做到这一点吗?

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

更新资料

截至2018-04-28,答案非常有趣,但是它们没有提供我想要的东西。进一步来说,

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

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

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



相关信息:对于人类可读:ls -lahtrpF --group-directories-first --color=always /devls -lsahG /dev,对于程序可读ls -lsa /devman ls有关详细信息,请参见文档。
user1742529

Answers:


16

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" \;'

1
如果您使用函数而不是别名,则引用引号不会那么多,如果使用pastecolumn,则可以获得更好的对齐方式:lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }由于大小和日期相似,对齐问题在答案中不明显。(这也会稍快一些,因为命令被调用的次数更少,而不是每个文件被调用一次。)
muru

@muru感谢您的许多好建议!这个方法column对您有用吗?它只是打印ls -l每个文件的输出,然后file为我打印每个文件的输出,好像shell会做的那样ls -l "$@"; file -b "$@" | cut -d, -f1……
甜点

是的 paste.ubuntu.com/p/KjPthXPDPb-顶部是别名,底部是函数,两者都从运行/etc
muru

我想我看到了问题-如果column的输出不是到终端,则需要指定列数,否则它将一个接一个地输出文件;因此column -c "$COLUMNS" ...无论哪种情况都应该起作用。
muru

您正在为每个文件启动(至少?)5个进程,所以当目录中有很多文件时,这可能会很慢……
JanC

10

我认为显示文件类型的最佳方法是使用以下命令:

file <filename>

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

file *

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

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

man file

虽然此答案不能直接回答OP的问题,但它显示了查找文件的mime类型的正确方法,应将其标记为正确答案。要获取mime type唯一的内容,请使用:file --mime-type filename
Pedro Lobito

@PedroLobito我认为密切相关的问题涵盖file得很好,但是这个问题有所不同。
甜点

鉴于您是第一个给出file答案的人,所以我对这个答案投了赞成票。正如我对其他人的回答,这还不够(需要与ls集成),因此我将其付诸表决。谢谢。
user10853 '18

1
文件*是最好的答案
特拉马达

1
file --mime /dev/*用于目录/ dev中的列表
哑剧(

7

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

‘-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左右以确定其类型。


@Zana感谢您引起我对这个标志的关注。尽管这不是我一直在寻找的(实际文件类型),但现在可以这样做。为此,我将投票赞成。
user10853 '18

3

文件类型的一种形式是文件是否是常规文件,目录,设备,符号链接等,ls都可以使用options -l或来显示-F

  • 选项-l将在列表的开头将文件类型显示为单个字符,例如:

    $ ls -l
    drwxrwxr-x 2 user user 4096 Dec 11 00:18 DIR
    -rw-rw-r-- 1 user user    0 Dec 11 00:18 FILE
    lrwxrwxrwx 1 user user    4 Dec 11 00:19 LINK -> FILE
    

    -常规文件,d目录和l符号链接在哪里。

  • 选项-F将文件类型显示为后缀,例如:

    $ ls -F
    DIR/ FILE LINK@
    

    没有后缀的是常规文件,/目录和@符号链接。

有关这些的更多信息,请参见info coreutils 'ls invocation',此处总结如下:

对于-l

‘-’ regular file
‘b’ block special file
‘c’ character special file
‘C’ high performance (“contiguous data”) file
‘d’ directory
‘D’ door (Solaris 2.5 and up)
‘l’ symbolic link
‘M’ off-line (“migrated”) file (Cray DMF)
‘n’ network special file (HP-UX)
‘p’ FIFO (named pipe)
‘P’ port (Solaris 10 and up)
‘s’ socket
‘?’ some other file type

对于-F

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.