KSH shell计算目录

时间:2016-02-29 22:00:28

标签: linux ksh

这是提示:

  

编写一个Korn shell脚本(并在此显示它的代码),它将确定目录中哪个文件具有最大行数(这可能与具有最大字节数的文件不同)。在确定具有最大行数的文件后,脚本将打印出文件名和行数。该脚本必须只关注文件并忽略子目录。命令wc可能会有所帮助。不要编写此脚本以交互方式执行。

     

要求:

     

脚本必须允许无参数或1参数。

     
      
  1. 如果指定了零参数,则默认情况下脚本将检查当前目录中的文件。
  2.   
  3. 如果指定了1个参数,则参数必须是a的名称   目录。然后,该脚本将检查指定的文件   目录。
  4.         

    脚本必须能够处理以下错误情况:

         
        
    1. 指定了多个参数。
    2.   
    3. 指定的参数不是目录。
    4.         

      脚本文件名必须为:maxlines.sh。   脚本权限应为705

这是我的代码:

#!/bin/ksh
if [ $# -gt 1];then
    echo "There must be 0 or 1 arguments"
    exit
fi
if [ -d "$1" ];then
    cd $#
    fi
    max=0
for file in *
do
    lines=$(( $( wc -l < "$file" ) ))
    if [ $max -lt $lines ];then
        max=$lines
    fi
done

任何建议都将不胜感激。我是Linux的新手,所以这非常令人沮丧。当我运行它时输出如下:

./maxlines.sh[2]: [: ']' missing
./maxlines.sh[9]: cd: 1: [No such file or directory]
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory

2 个答案:

答案 0 :(得分:0)

正如@JeremyBrooks已经解释过的那样,你的脚本中有很多错误,但你并没有走错路。

这是我的修复:

#!/bin/ksh
    if [ $# -gt 1 ];then
            echo "There must be 0 or 1 arguments"
            exit
    fi
    if [ -d "$1" ]
    then
            cd $1
    fi
    max=0
    for file in $(find . -name "*" -type f)
    do
            lines=$(( $( wc -l < "$file" ) ))
            if [ $max -lt $lines ];then
                    max=$lines
                    maxFile=$file
            fi
    done
    echo "file[$maxFile] - max[$max]"

使用for file in $(find . -name "*" -type f),您只能获得文件;在您以前的版本中,您还将获得目录,但您想要计算文件行。

防止排除目录的另一种方法是for file in $(ls -l * | grep -v "^d"|awk '{print $9}',但这并不像find那么快。

您在获得最大行号时也忘了保留文件名,因此在if中您必须添加maxFile=$file

然后不要忘记在echo "file[$maxFile] - max[$max]"之后打印出结果:for

答案 1 :(得分:0)

您还可以尝试将命令与管道组合:

 wc -l * 2>/dev/null| grep -v total | sort -n | tail -1 | sed -r 's/\s*([0-9]*) (.*)/\2 has \1 lines./'

您仍应处理参数(关于您拥有的参数,但在[]周围的if语句中使用空格)。如何处理没有文件的目录:

output=$(same_command_as_above)
if [ -z "${output}" ]; then ...