2010-06-19 156 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'" '{}' +