0

嗨,我是 Unix 和 bash 的新手,我想问一下 q。我怎样才能做到这一点

指定的目录作为参数给出。找到常规文件总行数最大的目录。浏览所有特定目录及其子目录。数量仅适用于直接位于目录中的文件。

我尝试了一些东西,但它不能正常工作。

 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

当我将此目录用作参数时,问题就在这里。(只是示例)

/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

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

4

2 回答 2

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
于 2013-11-02T20:34:40.793 回答
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 jackman好答案

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

于 2013-11-02T21:32:50.187 回答