如何找到常规文件行数总和最大的目录(以bash为单位)

时间:2013-11-02 17:52:15

标签: bash unix

你好我是unix和bash的新手,我想问问q。我怎么能这样做

  

指定的目录作为参数给出。找到目录   其中常规文件的行数之和最大。   浏览所有特定目录及其子目录。金额   只计算直接在目录中的文件。

我尝试somethnig,但它无法正常工作。

 while [ $# -ne 0 ];
  do case "$1" in 
         -h) show_help ;; 
         -*) echo "Error: Wrong arguments" 1>&2 exit 1 ;; 
         *) directories=("$@") break ;; 
esac 
shift 
done

IFS='
'
amount=0
for direct in "${directories[@]}"; do
    for subdirect in `find $direct -type d `; do
       temp=`find "$subdirect" -type f -exec cat {} \; | wc -l | tr -s " "`
       if [ $amount -lt $temp ]; then
            amount=$temp
            subdirect2=$subdirect
       fi
    done
    echo Output: "'"$subdirect2$amount"'"
done

当我使用这个dirc作为参数时,问题就在这里。(只是示例)

/home/usr/first and there are this direct. 
/home/usr/first/tmp/first.txt (50 lines) 
/home/usr/first/tmp/second.txt (30 lines) 
/home/usr/first/tmp1/one.txt (20 lines) 

它会在输出/home/usr/first/tmp1 100上给我,这是错误的应该是/home/usr/first/tmp 80

我想深入扫描所有目录及其所有子目录。此外,如果多个目录符合最大值,则应列出所有目录。

2 个答案:

答案 0 :(得分:1)

鉴于您的示例文件,我将假设您只想查看直接子目录,而不是递归到几个级别:

max=-1
# the trailing slash limits the wildcard to directories only
for dir in */; do
    count=0
    for file in "$dir"/*; do
        [[ -f "$file" ]] && (( count += $(wc -l < "$file") ))
    done
    if (( count > max )); then
        max=$count
        maxdir="$dir"
    fi
done
echo "files in $maxdir have $max lines"
files in tmp/ have 80 lines

答案 1 :(得分:0)

本着Unix(caugh)的精神,这是一个我个人讨厌的绝对令人作呕的管道链,但构建:)非常有趣:

find . -mindepth 1 -maxdepth 1 -type d -exec sh -c 'find "$1" -maxdepth 1 -type f -print0 | wc -l --files0-from=- | tail -1 | { read a _ && echo "$a $1"; }' _ {} \; | sort -nr | head -1

当然,除非您患有精神疾病,否则不要使用此功能,请使用glenn jackmannice answer instead

您也可以很好地控制find的无限过滤功能。好极了。但是请使用格伦的答案!