Unix命令:查找目录中具有所需扩展名的文件数

时间:2013-11-21 22:12:08

标签: unix find

我想获得文件总数 -

  • 在所有目录和子目录中。
  • ,扩展名为.tif / .jpeg / .gif
  • 名称不应以“。”开头。

是否可以按

列出文件数量

例如。

如果目录结构类似 -

MM
|
|-- ART1 
|    |
|    |-- img1.tif
|    |-- img2.tif
|    |-- img3.tif
|    |-- img4.tif
|
|-- ART2 
|    |
|    |-- img1.tif
|    |-- .img2.tif
|    |-- img.doc
|    |-- img4.tif

结果应该像 -

MM\ART1 4 files 
MM\ART2 2 files

Total Files: 6

我尝试使用 -

find . -print | grep -E '\.tif+$'

1 个答案:

答案 0 :(得分:2)

这个怎么样?

$ find . -mindepth 1 -type f ! -name ".*" \( -name "*.tif" -or -name "*.jpeg" -or -name "*.gif" \) -exec sh -c 'file={}; printf "%s %s %s\n" $(dirname {}) $(basename {}) ${file##*.}' \; | awk '{a[$1]++; b[$3]++; tot++} END{for (i in a) print i, a[i]; for (i in b) print i, b[i]; print tot " files"}'
./ART1 4
./ART2 2
tif 6
6 files

如果我们在ART1 / foo.jpeg中创建另一个文件:

$ find . -mindepth 1 -type f ! -name ".*" \( -name "*.tif" -or -name "*.jpeg" -or -name "*.gif" \) -exec sh -c 'file={}; printf "%s %s %s\n" $(dirname {}) $(basename {}) ${file##*.}' \; | awk '{a[$1]++; b[$3]++; tot++} END{for (i in a) print a[i], i; for (i in b) print b[i], i; print tot " files"}'
5 ./ART1
2 ./ART2
1 jpeg
6 tif
7 files

解释

$ find . -mindepth 1 -type f ! -name ".*" \( -name "*.tif" -or -name "*.jpeg" -or -name "*.gif" \) -exec sh -c 'file={}; printf "%s %s %s\n" $(dirname {}) $(basename {}) ${file##*.}' \; 
./ART1 img2.tif tif
./ART1 img4.tif tif
./ART1 foo.jpeg jpeg
./ART1 img3.tif tif
./ART1 img1.tif tif
./ART2 img4.tif tif
./ART2 img1.tif tif

find命令查找与请求匹配的文件: - 文件。 - 名称不以.开头 - 分机tifjpeggif

然后打印存储它的目录+名称+扩展名。

awk '{a[$1]++; b[$3]++; tot++} END{for (i in a) print a[i], i; for (i in b) print b[i], i; print tot " files"}'

根据以前的输出,它计算: - 每个目录有多少个文件(第一条记录,即$1) - 每个扩展名有多少个文件(第三条记录,即$3) - 文件总数。

然后将它们打印在END{}块上。