如何显示目录中包含的所有文件类型?


12

是否有命令告诉我特定目录中存在哪些文件类型?

我可以使用像这样的命令找出文件类型od -c myfile | less

但是我不知道如何对目录中的所有文件执行此操作。

Answers:


19

尽管od -c确实会显示文件的内容,但这不是获取文件类型的好方法。虽然某些文件将包含具有文件类型的标头,但并非全部都包含。更好的方法是命令file

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

因此,要获取目录中所有文件类型的列表,可以执行以下操作:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

输出示例:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

说明

  • for file in dir/*; do ... done;:遍历所有内容dirdir仅作为示例,您应该将其更改为要搜索的实际目录的名称),然后依次将每个项目保存为$file
  • file "$file"file对找到的每个项目运行。
  • cut -d: -f 2:仅打印第二个字段(由定义的字段:
  • sed 's/^ //; s/ +/ /g' :从行首删除空格,并将连续的空格转换为单个空格。
  • sort -u :删除重复的文件类型

谢谢,但是我精确地复制并粘贴了“用于dir / *中的文件;将文件“ $ file” |剪切-d:-f 2 |排序-u;完成”在终端中,我得到了“错误”
Mohammad Reza Rezwani

2
@alex首先,请总是提及您得到的确切错误,说您收到“ ERROR”不是很有用。无论如何,该错误可能是因为您没有名为的目录dir/,这只是一个示例名称,您需要将其更改为真实目录的名称:for file in /home/alex/*; do ... done例如。
terdon 2014年

谢谢,如果您做错了工作(...我以为dir是ls而不是目录之类的命令-对不起,我也想编辑您的答案更好)您只看到“ ERROR”,什么也没有。
Mohammad Reza Rezwani 2014年

很好,谢谢,但是我看到例如四行“ ID3版本2.3.0的音频文件包含”或多个“ ISO媒体,MPEG v4系统,版本2”。我不确定“删除重复项”。
Mohammad Reza Rezwani 2014年

@alex足够公平,答案已编辑。您不应该得到任何重复。该sort -u会将其删除,该行必须是不同的(它们也可能有不同数量的空间,这使得它们不相同)。
terdon 2014年


1

尝试这个:

ls | xargs file -b | sort | uniq

怎么运行的:

ls:列出目录内容

文件-b:确定文件类型;不要在输出行前添加文件名

sort:排序行

uniq:省略重复的行



1
您可以使用file -b *代替ls | xargs file -b,以避免解析ls
wjandrea
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.