UNIX命令列出文件数量的文件夹

我想获得当前级别的文件夹列表(不包括其子文件夹),只需打印文件夹名称和文件夹中的文件数目(如果可能,最好过滤为* .jpg)。

这是可能的标准bash shellls -l打印一切,但文件数:)

我想出了这个:

 find -maxdepth 1 -type d | while read dir; do count=$(find "$dir" -maxdepth 1 -iname \*.jpg | wc -l) echo "$dir ; $count" done 

如果在jpg文件的目录中的搜索应该是考虑子目录的递归,则删除第二个-maxdepth 1 。 请注意,只考虑文件的名称。 你可以重新命名一个文件,隐藏它是一个JPG图片。 您可以使用file命令对内容进行猜测(现在也是递归地搜索):

 find -mindepth 1 -maxdepth 1 -type d | while read dir; do count=$(find "$dir" -type f | xargs file -b --mime-type | grep 'image/jpeg' | wc -l) echo "$dir ; $count" done 

然而,这要慢得多,因为它必须读取部分文件并最终解释它们包含的内容(如果幸运的话,它会在文件的开始处找到一个神奇的id)。 -mindepth 1阻止它打印. (当前目录)作为它搜索的另一个目录。

我发现这个问题后,我已经找到了我自己的类似的脚本。 它似乎符合你的条件,非常灵活,所以我想我会添加它作为答案。

优点:

  • 可以分组到任何深度 (0代表,1代表第一级子目录等)
  • 打印漂亮的输出
  • 没有循环,只有一个find命令,所以它在大型目录上快一点
  • 仍然可以调整添加自定义过滤器(maxdepth使其非递归,文件名称模式)

原始码:

  find -P . -type f | rev | cut -d/ -f2- | rev | \ cut -d/ -f1-2 | cut -d/ -f2- | sort | uniq -c 

包装成功能并解释说:

 fc() { # Usage: fc [depth >= 0, default 1] # 1. List all files, not following symlinks. # (Add filters like -maxdepth 1 or -iname='*.jpg' here.) # 2. Cut off filenames in bulk. Reverse and chop to the # first / (remove filename). Reverse back. # 3. Cut everything after the specified depth, so that each line # contains only the relevant directory path # 4. Cut off the preceeding '.' unless that's all there is. # 5. Sort and group to unique lines with count. find -P . -type f \ | rev | cut -d/ -f2- | rev \ | cut -d/ -f1-$((${1:-1}+1)) \ | cut -d/ -f2- \ | sort | uniq -c } 

产生这样的输出:

 $ fc 0 1668 . $ fc # depth of 1 is default 6 . 3 .ssh 11 Desktop 44 Downloads 1054 Music 550 Pictures 

当然,首先可以通过管道sort

 $ fc | sort 3 .ssh 6 . 11 Desktop 44 Downloads 550 Pictures 1054 Music 

我的命令行输入速度更快。 🙂

其他建议是否提供了比以下任何真正的优势?

 find -name '*.jpg' | wc -l # recursive find -maxdepth 1 -name '*.jpg' | wc -l # current directory only 
 #!/bin/bash for dir in `find . -type d | grep -v "\.$"`; do echo $dir ls $dir/*.jpg | wc -l done; 

你可以不用外部命令:

 for d in */; do set -- "$d"*.jpg printf "%s: %d\n" "${d%/}" "$#" done 

或者,您可以使用awkSolaris上的nawk/ usr / xpg4 / bin / awk ):

 printf "%s\n" */*jpg | awk -F\/ 'END { for (d in _) print d ":",_[d] } { _[$1]++ }'