2010-11-22 6 views
1

シェルスクリプトの新機能ですから、これは本当に基本的なものです。私の質問はこれです、私はディレクトリを見て、私がファイル名で指定した文字列の一致を見つけるか教えてくれるスクリプトを書く必要があります。ここに例があります。ディレクトリに名前をつけて特定の文字列を含むファイルを検索します

私はtmpという名前のディレクトリを持っています。このディレクトリーの中には、tmp-a、temp-a、temporary-aなどのファイルがあります。スクリプトがディレクトリーを調べ、 'tmp'または 'temp'という文字列を持つファイル名がある場合、しかし、シェルスクリプトで指定された文字列に一致するファイル名が見つからない場合は、終了する必要があります。私は基本的に条件付きのif [-f filename]ステートメントを検索して、 'または'を適用できます。

いつものように感謝していただきたいと思います。一致するファイルが存在しない場合

ティム

+0

ああ、ありがとうございます。上記のとおり、簡単でした。私はgrepの-eスイッチを見たことはありません。あなたの時間を無駄にして申し訳ありません。もう一度ありがとう、良い一日を。 – Tim

+1

grepはここでは使用しません。まず、ファイル名のリストを入力する必要があります(no、['ls'は方法ではありません](mywiki.wooledge.org/ParsingLs))、両方のシェルパターンと' find 'は名前にパターンマッチングを行い、grepは役に立たなくします。 – Gilles

答えて

2

パターンtmp*は名前tmpで始まるファイルのリストに、またはリテラルパターンそのものからなる単一ワードのリストに展開されます。 bashで

set -- 
for pattern in 'tmp*' 'temp*'; do 
    set -- $pattern "[email protected]" 
    if [ ! -e "$1" ]; then shift; fi 
done 
if [ $# -eq 0 ]; then 
    echo "No matching file" 
else 
    for x in "[email protected]"; do …; done 
fi 

、あなたが問題に多くを簡素化し、空のリスト、すべきファイルと一致しないパターンの拡大を要求することができます。

shopt -s nullglob 
set -- tmp* temp* 
if [ $# -eq 0 ]; then … 

同じことがパターンごとに設定できるzshと同じです。あなたは再帰的に内部のディレクトリを検索したい場合は

set -- tmp*(N) temp*(N) 
if [ $# -eq 0 ]; then … 

は、あなたがfindコマンドを使用することができます。

if [ -n "$(find -name 'tmp*' -o -name 'temp*' | head -c 1)" ]; then 
    # there are matching files 
fi