0

他の人が作成した bash スクリプトを少し変更する必要があります。私は Bash を初めて使用するので、いくつかの一般的なコマンドについて少し助けが必要な場合があります。

スクリプトは、特定のファイル拡張子のディレクトリを (再帰的に) ループするだけです。現在のスクリプトは次のとおりです: (runme.sh)

#! /bin/bash
SRC=/docs/companies/

function report()
{
    echo "-----------------------"
    find $SRC -iname "*.aws" -type f -print
    echo -e "\033[1mSOURCE FILES=\033[0m" `find $SRC -iname "*.aws" -type f -print |wc -l`
    echo "-----------------------"
exit 0
}

report

#./runme.shと入力するだけで、拡張子が .aws のすべてのファイルのリストを表示できます。

私の主な目標は、検索を制限することです。(一部のディレクトリにはファイルが多すぎます) スクリプトを実行して、20 個のファイルに制限したいと思います。

スクリプト全体をループ メソッドに配置する必要がありますか?

4

3 に答える 3

1

これは簡単です。最初の20個のファイルが必要な限り、最初のfindコマンドをにパイプするだけhead -n 20です。しかし、私がそれに取り組んでいる間、少しのクリーンアップに抵抗することはできません。書かれているようにfind、ファイル名を印刷するためとファイル名を数えるために1回ずつ、2回実行されます。検索するファイルがたくさんある場合、これは時間の無駄です。第2に、スクリプトの実際のコンテンツを関数(report)でラップすることはあまり意味がなく、関数exitreturningではなく)を持つことはさらに意味がありません。最後に、ファイル名を二重引用符で保護し、逆引用符を使用しないようにします($()代わりに使用します)。だから私は少しのクリーンアップの自由を取りました:

#! /bin/bash
SRC=/docs/companies/

files="$(find "$SRC" -iname "*.aws" -type f -print)"
if [ -n "$files" ]; then
    count="$(echo "$files" | wc -l)"
else # echo would print one line even if there are no files, so special-case the empty list
    count=0
fi

echo "-----------------------"
echo "$files" | head -n 20
echo -e "\033[1mSOURCE FILES=\033[0m $count"
echo "-----------------------"
于 2012-07-27T05:27:07.017 に答える
0

使用head -n 20(ピーターによって提案されたように)。追記:スクリプトはfind2回実行されるため、非常に非効率的です。teeコマンドを初めて実行するときに一時ファイルを生成するためにを使用することを検討する必要があります。その後、このファイルの行数を数え、ファイルを削除します。

于 2012-07-27T05:31:29.253 に答える
0

私は個人的に次のようにすることを好みます:

files=0
while read file ; do
    files=$(($files + 1))
    echo $file
done < <(find "$SRC" -iname "*.aws" -type f -print0 | head -20)

echo "-----------------------"
find $SRC -iname "*.aws" -type f -print
echo -e "\033[1mSOURCE FILES=\033[0m" $files
echo "-----------------------"

カウントしたいだけなら、find "$SRC" -iname "*.aws" -type f -print0 | head -20

于 2012-07-27T10:11:29.843 に答える