我必须编写一个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.
谢谢!
答案 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)
看起来你在计算平均值而非中位数,确定你想要的是什么。
~
个文件是编辑者创建的备份文件。它们是普通文件,因此您的程序正在计算它们的行数。