我必须编写一个shell脚本,该脚本创建一个文件,其中包含文件夹中每个文本文件的名称(作为参数给出)以及包含长于n个字符的单词的子文件夹(从键盘读取n)。
到目前为止,我编写了以下代码:
#!/bin/bash
if [ ! -d $1 ]
then echo $1 is not a directory\!
exit 1
fi
echo -n "Give the number n: "
read n
echo "You entered: $n"
destinatie="destinatie"
nr=0;
#while read line;
#do
for fisier in `find $1 -type f`
do
counter=0
for word in $(<$fisier);
do
file=`basename "$fisier"`
length=`expr length $word`
echo "$length"
if [ $length -gt $n ];
then counter=$(($counter+1))
fi
done
if [ $counter -gt $nr ];
then echo "$file" >> $destinatie
fi
done
break
done
exit
该脚本可以运行,但它还可以执行一些我不需要的步骤。它似乎可以读取一些文件超过1次。如果有人可以帮助我吗?
答案 0 :(得分:0)
此代码存在语法错误,可能是您已注释掉的while
循环中遗留的内容:最好删除最后3行:done
导致错误{{1} }和break
是不必要的,因为没有什么可以突破,程序总是在它结束时终止。
程序似乎多次输出文件,因为您只是附加到exit
。您可以在开始时删除该文件:
$destinatie
您将数字回显到stdout(rm "$destinatie"
),将文件名回显到echo "$length"
($destinatie
)。我不知道这是否是故意的。
答案 1 :(得分:0)
这有帮助吗?
egrep -lr "\w{$n,}" $1/* >$destinatie
一些解释:
\w
表示:单词由
{$n,}
表示:连续字符数至少为$n
选项-l
列出文件但不打印grepped文本,-r
在$1
编辑:
关于egrep命令的更完整版本:
#!/bin/bash
die() { echo "$@" 1>&2 ; exit 1; }
[ -z "$1" ] && die "which directory to scan?"
dir="$1"
[ -d "$dir" ] || die "$dir isn't a directory"
echo -n "Give the number n: "
read n
echo "You entered: $n"
[ $n -le 0 ] && die "the number should be > 0"
destinatie="destinatie"
egrep -lr "\w{$n,}" "$dir"/* | while read f; do basename "$f"; done >$destinatie
答案 2 :(得分:0)
我发现了问题。问题是我正在搜索的目录。因为我处理了来自direcotry的文件并修改了它们,似乎仍有一些文件未在文件浏览器中显示但脚本会找到他们。我创建了另一个目录,我把它作为参数给出,它的工作原理。谢谢您的回答