2010-06-19 176 views
4

我想列出所有目录并将其数量放在它旁边。查找pwd中所有目录的目录中的文件数

我能找到的文件总数ls -lR | grep .*.mp3 | wc -l。但我怎么能得到一个输出这样的:

dir1 34 
dir2 15 
dir3 2 
... 

我不介意写入文本文件或CSV来获取这些信息如果无法得到它在屏幕上。

谢谢大家对此的任何帮助。

回答

3

可能有更好的方法,但这似乎工作。

在shell脚本将这个:

#!/bin/sh 
for f in * 
do 
    if [ -d "$f" ] 
    then 
     cd "$f" 
     c=`ls -l *.mp3 2>/dev/null | wc -l` 
     if test $c -gt 0 
     then 
      echo "$f $c" 
     fi 
     cd .. 
    fi 
done 
+0

真棒!这对我来说是最好的答案,因为它允许我轻松地在目录和数字之间添加逗号,所以我可以将它用作CSV文件以便在Excel中查看,并且还可以在屏幕上查看它。谢谢你。 :) – Abs 2010-06-19 13:30:06

4
find . -type f -iname '*.mp3' -printf "%h\n" | uniq -c 

或者,如果顺序(DIR-> count,而不是count-> DIR)是真正重要的是你:

find . -type f -iname '*.mp3' -printf "%h\n" | uniq -c | awk '{print $2" "$1}' 
+0

+1很好。 – Abs 2010-06-19 13:30:37

+0

如果没有“排序”,它可以多次列出一些目录。你的awk命令可以简化为'awk'{print $ 2,$ 1}''或者你可以像这样使用OP的逗号分隔的样式:'awk'{print $ 2','$ 1}' – 2010-06-19 13:41:00

+0

我最终使用了: 'find/-type f -printf“%h \ n”|排序| uniq -c | sort -r -n |头' 额外的排序,以确保'uniq'统计每个人一次。 第二'排序'是按数字排序,反向 - 'head'给你TOP10 – 2011-09-08 08:51:19

7

这似乎工作假设你在一个目录中的一些子目录可能包含MP3文件。它省略了顶层目录。它将按照包含的最大数量的mp3文件的顺序列出目录。

find . -mindepth 2 -name \*.mp3 -print0| xargs -0 -n 1 dirname | sort | uniq -c | sort -r | awk '{print $2 "," $1}' 

我用print0更新了这个,用空格和其他棘手字符处理文件名,并打印适合CSV的输出。

+0

+1很好用。 – Abs 2010-06-19 13:30:57

+0

除非我做'xargs -I {} -n 1 dirname \ {\}',否则我会得到一个额外的'.'。 – 2010-06-19 13:39:10

+0

你有什么操作系统和版本的find? -mindepth 2应该消除'.'。我正在运行Ubuntu 10.04 GNU find 4.4.2。这个命令不包含'.'。我测试了带有和没有mp3文件的''。 – 2010-06-19 22:34:48

0

用Perl:

perl -MFile::Find -le' 
    find { 
    wanted => sub { 
     return unless /\.mp3$/i; 
     ++$_{$File::Find::dir}; 
     } 
    }, "."; 
    print "$_,$_{$_}" for 
    sort { 
     $_{$b} <=> $_{$a} 
     } keys %_; 
    ' 
0

这里是另一种方式来处理,甚至含有异常的(但合法)的字符,如换行的文件名,...:

# count .mp3 files (using GNU find) 
find . -xdev -type f -iname "*.mp3" -print0 | tr -dc '\0' | wc -c 

# list directories with number of .mp3 files 
find "$(pwd -P)" -xdev -depth -type d -exec bash -c ' 
    for ((i=1; i<=$#; i++)); do 
    d="${@:i:1}" 
    mp3s="$(find "${d}" -xdev -type f -iname "*.mp3" -print0 | tr -dc "${0}" | wc -c)" 
    [[ $mp3s -gt 0 ]] && printf "%s\n" "${d}, ${mp3s// /}" 
    done 
' "'\\0'" '{}' + 
相关问题