Unix - 递归计算文件类型的数量

11

我是Stack Overflow的新手,对Linux也不太熟悉。我一直在尝试使用以下命令过滤父目录及其子目录中的特定文件:

ls -R | grep '*.jpg' | wc -l

当查找单个文件时,我发现这非常有用,但我需要每月执行此操作,并寻找更快速列出多种类型文件的方法。我故意要排除隐藏文件。

我尝试过这个命令,但没有成功 — Count number of specific file type of a directory and its sub dir in mac

我在网上看到了不同的方法,如list、find、tree、echo等。所以,任何关于这个问题的帮助都将不胜感激。如果当前的方法不是最佳方法,那么也没有问题,因为我愿意听取建议。我只是不确定现在最好的方法是什么!

非常感谢!

4个回答

14

你可以借助find实现这个功能,就像在你的最初帖子中提到的链接中所述的那样。只需要像下面这样操作:

find . -name \*.jpg -or -name \*.png -not -path \*/\.\* | wc -l

这很好用,但它也包括了目录中的隐藏文件,我不想要那些。 - Pampa
3
如果您希望忽略大小写并匹配大小写不同的文件扩展名,可以使用"-iname"代替"-name"。 - mark4o

4

如果你在这里寻找更多概括性的内容,下面是一种递归计算文件夹中所有文件扩展名的方法:

find . -type f -name '*.*' -not -name '.*' | sed -Ee 's,.*/.+\.([^/]+)$,\1,' | sort | uniq -ci | sort -n

这将会得到一个类似以下的摘要:
    422 mov
   1043 mp4
   3266 png
   6738 CR3
   9417 RAF
  29679 cr2
  60949 jpg

0

你可以使用grep过滤多个模式。你应该学习Linux中的manpages,只需在终端中键入man grep,就可以看到这个程序的功能和用法。

对于你的问题,你可以使用以下命令来过滤PNG和JPEG文件(忽略大小写,因此获取PNG和png文件):

ls -R | grep -i '*.jpg\|*.png' | wc -l

-i会忽略名称的大小写,\|是一个或连接符。


-i 标志在我的原始命令上运行良好,但运行 ls -R | grep -i '.rtf|.txt' | wc -l 返回 0 个结果。看起来是 or 的原因,我已经测试了我知道包含结果的不同文件类型。 - Pampa

0

感谢大家的贡献,如果这对某个人有用的话,我得到了一位开发者朋友的帮助,他很友善地为我调查了一下,我发现在我的特定情况下最好的方法是以下内容:

find . -type f \( -iname "*.jpg" ! -iname ".*.png" ! -path "*/.HSResource/*" \) |wc -l

这将跳过资源文件夹和隐藏文件,并似乎返回了正确的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接