1

假设我停留在当前目录中,我想列出所有文件的总数,以及大小、权限以及按类型列出的文件数。

这是示例输出:

这是一个示例:

打印有关“/home/user/poker”的信息

文件总数:83

pdf文件:5

.html 文件:9

文本文件:15

未知:5

注意:任何没有扩展名的文件都可以被认为是未知的。

我希望使用一些简单的命令,如 ls、cut、sort、unique,(只是示例)将每个不同的扩展名放在文件中并使用 wc -l 来计算行数

还是我需要使用 grep、awk 或其他什么?

希望得到大家的意见。谢谢!

4

3 回答 3

3

最好的方法是使用file仅输出 mimetype 并将其传递给awk.

file * -ib | awk -F'[;/.]' '{print $(NF-1)}' | sort -n | uniq -c

在我的主目录上,它会产生这个输出。

 35 directory
  3 html
  1 jpeg
  1 octet-stream
  1 pdf
 32 plain
  5 png
  1 spreadsheet
  7 symlink
  1 text
  1 x-c++
  3 x-empty
  1 xml
  2 x-ms-asf
  4 x-shellscript
  1 x-shockwave-flash

如果您认为text/x-c++并且text/plain应该相同,请使用此

 file * -ib | awk -F'[;/.]' '{print $1}' | sort -n | uniq -c

  6 application
  6 image
 45 inode
 40 text
  2 video

{print $1}根据需要更改零件以获得适当的输出。

于 2012-08-18T17:12:07.077 回答
0

find . -type f | xargs -n1 basename | fgrep . | sed 's/.*\.//' | sort | uniq -c | sort -n

这为您提供了文件扩展名的递归列表。如果您只想要当前目录-maxdepth 1,请在 find 命令中添加一个。

于 2012-08-18T16:54:00.593 回答
0

你需要bash

files=(*)
pdfs=(*.pdf)

echo "${#files[@]}"
echo "${#pdfs[@]}"
echo "$((${#files[@]}-${#pdfs[@]}))"
于 2012-08-18T14:39:33.230 回答