首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于计数目录中的文件行的KSH。

问用于计数目录中的文件行的KSH。
EN

Stack Overflow用户
提问于 2016-02-29 22:00:27
回答 2查看 747关注 0票数 0

这是提示符:

编写Korn脚本(并在这里显示它的代码),该脚本将确定某个目录中的哪个文件具有最大行数(这可能与具有最大字节数的文件不同)。确定最大行数的文件后,脚本将打印出文件名和行数。脚本必须只关注文件而忽略子目录。命令wc可能会有所帮助。不要编写要交互执行的脚本。 要求: 脚本必须不允许任何参数或1参数。

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

脚本必须能够处理以下错误条件:

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

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

这是我的代码:

代码语言:javascript
复制
#!/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新手,所以这是相当令人沮丧的。当我运行它时,输出如下所示:

代码语言:javascript
复制
./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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-01 10:52:16

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

这是我的解决办法:

代码语言:javascript
复制
#!/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。

票数 0
EN

Stack Overflow用户

发布于 2016-03-01 20:37:56

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

代码语言:javascript
复制
 wc -l * 2>/dev/null| grep -v total | sort -n | tail -1 | sed -r 's/\s*([0-9]*) (.*)/\2 has \1 lines./'

您仍然应该处理参数(除了在[和]周围的if-语句中使用空格)。以及如何处理没有文件的dir:

代码语言:javascript
复制
output=$(same_command_as_above)
if [ -z "${output}" ]; then ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35710550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档