计算shell脚本中文件的中等行数

时间:2014-05-11 12:17:22

标签: linux shell

我必须编写一个shell脚本,它接受一个目录的名称,然后搜索其中的所有文件和所有子目录,并计算中等行数。 这是我试过的:

#!/bin/sh

if [ $# -eq 0 ] #  check if a directory was pass as argument 
then
    echo "The call requires a directory name ! ";
    exit 1
fi

dirname=$1  # save the directory name
if [ ! -d $dirname ]  # check if it is a valid directory 
then
    echo $dirname is not a directory
    exit 1
fi

files_number=0    # the total number of files
files_lines_nr=0  # the total number of lines of the files

for fis in ` find $dirname -type f ` # loops the files in all the directories
do
    lines=` wc -l <$fis ` # get the number of lines in a file
    files_number=` expr $files_number + 1 ` # counts the number of files
    files_lines_nr=` expr $files_lines_nr + $lines ` # updates the total number of lines
done
echo "The medium number of lines :" ` expr $files_lines_nr / $files_number ` 

如果我通过了具有1个文件test3 ad 1子目录的drectory hw1 - &gt;包含test2和test1文件,我得到值7(文件test2中的行数)两次。我做了一些回声,结果如下:

0  in file tema1/test1~ 
0  in file tema1/test3~ 
7  in file tema1/subhw1/test2~  //why ?
7  in file tema1/subhw1/test2  // correct number of lines
11  in file tema1/test3  // correct number of lines
5  in file tema1/test1  // correct number of lines
Total number of lines :30  // incorect computes 7 twice
The medium number of lines : 5 // incorect there are only 3 files ,he counts 6.

谢谢!

3 个答案:

答案 0 :(得分:1)

您的目录中似乎有tmp文件,其后缀为~

如果你第一次跑:

  rm tema1/test1~
  rm tema1/test3~
  rm tema1/subhw1/test2~

然后运行你的脚本一切都应该是正确的。

答案 1 :(得分:1)

由于~文件会在您点击&#34;保存&#34;在您的编辑器中,您可能需要考虑系统地排除它们,而不是简单地删除现在存在的那些。这样,随着时间的推移,shell脚本将更有用。您可以使用find命令执行此操作。这是一个例子:

find . -type f -and \( -name "*~" -prune -or -print \)

它说两件事必须是真的:它必须是一个普通文件,它必须是以~结尾的情况,在这种情况下,find将 prune 结果(即不打印),或者打印出来。

稍微不易阅读的POSIX兼容版本是:

find . -type f \( -name "*~" -prune -o -print \)

但是,不同的编辑器对临时/备份文件有不同的命名方案。 Vim使用.filename.swp,Emacs使用#filename#,而GEdit使用filename~来命名。对于一个真正多功能的脚本,您可能也想考虑支持这些:

find . -type f \( -name "*~" -prune -o \
                  -name "*#" -prune -o \
                  -name "*.swp" -prune -o -print \)

答案 2 :(得分:0)

看起来你在计算平均值而非中位数,确定你想要的是什么。

~个文件是编辑者创建的备份文件。它们是普通文件,因此您的程序正在计算它们的行数。