如何在所有子目录中列出超过n个字符的文件

时间:2015-03-22 10:39:47

标签: bash shell

我必须编写一个shell脚本,该脚本创建一个文件,其中包含文件夹中每个文本文件的名称(作为参数给出)以及包含长于n个字符的单词的子文件夹(从键盘读取n)。

到目前为止,我编写了以下代码:

#!/bin/bash

验证第一个给定参数是否为文件夹:

if [ ! -d $1 ]
then echo $1 is not a directory\!
exit 1
fi

读n

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次。如果有人可以帮助我吗?

3 个答案:

答案 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的文件并修改了它们,似乎仍有一些文件未在文件浏览器中显示但脚本会找到他们。我创建了另一个目录,我把它作为参数给出,它的工作原理。谢谢您的回答