我不知道是否ls
能够显示文件类型列。
快速在线搜索并搜索后,man
没有发现这样的功能。它能做到这一点吗?
澄清:如果文件没有扩展名,这将特别有用。
更新
截至 2018-04-28,答案相当有趣,但它们没有提供我想要的内容。更具体地说,
file
确实提供了实际的文件类型,但它与 集成得不太好ls
。具体来说,我使用ls -lhtrpG --group-directories-first --color=always
ls -F
是一个ls
解决方案但是它提供的是符号而不是实际文件类型的列。
因此,我没有将任何答案标记为我正在寻找的答案。
答案1
答案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 -l
。wjandrea 的回答更详细地描述了这一点。
但我不认为这就是您所说的文件类型。该ls
命令不会查看常规文件内部 - 只会查看目录列表(存储文件名)和 inode(存储元数据,包括前面提到的“类型”)。
因此,该ls
命令无法显示文件类型,即它是 JPG 图像、二进制文件、文本文件还是某种 LibreOffice 文档,因为它没有这些信息。
为此,singrium 的回答指出,您需要该file
命令,它查看文件内容的前 50-100kB 左右以确定其类型。
答案4
这是使用 paste 合并 ls 和 file 命令的两个输出的另一种方法
paste <(ls -dl *) <(file * | cut -d: -f2)