2012-01-07 9 views
1

私は以下の簡単なスクリプトを用意しています。このスクリプトは、ファイル名とデリミタまたはカット位置の引数の数を持つ外部スクリプトを呼び出します。私の質問:ディレクトリには常にそのファイル名が含まれていて、どちらかの端に余分なテキストがあるという意味で、ファイル名を「動的なワイルドカードを使用して」作成する方法はありますか?しかし、スクリプトは 'contains'に基づいて完全なファイル名を取得するためにいくつかの種類のマッチを行うことができます。ファイル名の部分文字列に基づくスクリプト(おそらくワイルドカードを使用)

現在/解放/ ext /ディレクトリ、内容:

2011storesblah.dat 
hrlatest.dat 
emp_new12.txt 

ディレクトリすなわち、今日、これらのファイルが含まれています(ただし、来週、このディレクトリ内のファイル名が若干異なるプレフィックスを持つことができ 例:。

stores_newer.dat 
finandhr.dat 
emps.txt 

スクリプト:

#!/bin/bash 
    FILES='/release/ext/stores.dat "|" 
    /release/ext/emp.txt 1-3 4-11 15-40 
    /release/ext/hr.dat "|" 2' 
    for f in $FILES 
    do 
     echo `sh myexternalscript.sh $f`; 
    done 

注:なしありスクリプト内のファイルがdirec内の2つ以上のファイルと一致するシナリオを処理する必要があります(常に1つのみに一致します)。 また、スクリプトで指定されているファイルの種類にしか一致しません。 また、私は再帰的に検索する必要はなく、/ release/ext /ディレクトリだけを調べる必要があります。 私はSunOS 5.10を実行しています。

+0

SunOS 5.10を実行している場合、なぜあなたの質問に 'Linux'というタグを付けましたか? – thkala

答えて

1
$FILES=`find /release/ext -name *stores*.dat` 
for FILE in $FILES do 
    # need to test for empty, case $FILES is empty 
    test -n "$FILE" && /do/whatever/you/want 
done; 
+1

彼は検索を再帰的にしたくないと言った。このスニペットは、スペースを含むファイルを分割します。 SunOS 5.10が-maxdepthをサポートしているかどうかはわかりません。 – jordanm

+0

@jordanm OQの例ではスペースは表示されません。サブディレクトリが存在する場合(OQではなく)、 'test -n" $ FILE "&& test /' dirname "$ FILE" \ '=="/release/ext "&&/do/what/you/want'のようなものを使用できますmaxdepthがない場合 –

+0

ファイル名にスペースを入れる必要はありません。しかし、 '店舗'、 'hr'などの別々のループが必要ですか?そして、他の引数はファイル名の横にありますか? – toop

1

$FILES変数にパイプ文字と数字がどのようなものかはっきりしていません。しかし、ここであなたが有用見つけるかもしれない何かである:

#!/bin/bash 
filespecs='*stores*.dat *hr*.dat *emp*.txt' 
dir='/release/ext' 

cd "$dir" 
for file in $filespecs 
do 
    sh myexternalscript.sh "$dir/$file" 
done 

注あなたの質問は、「bashの」タグ付けされ、あなたのシェバングに「bashの」を使用していますが、呼び出したときに何らかの理由で、あなたは「SH」を使用して、あなたの他のスクリプト。いくつかのシステムでは、shはBashにシンボリックリンクされていますが、直接呼び出されるとBashとは異なる動作をします。多くのシステムでは、shはBashから完全に分離されています。

globを拡張して他の引数を組み込むには、常に変数を引用するBashルールに違反する必要があります(これは例外の1つの例です)。

filespecs='*stores*.dat | 3 
*hr*.dat 4 5 
*emp*.txt 6 7 8' 
while read -r spec arg1 arg2 arg3 arg4 
do 
    sh myexternalscript.sh "$dir"/$spec "$arg1" "$arg2" "$arg3" "$arg4" 
done < <(echo "$filespecs") 

あなたが必要と思うほど多くの「arg」引数を使用します。エクストラは空として渡されますが、引数を設定します。変数を受け入れる変数より多くの引数がある場合、最後の変数は、それに対応する変数に加えて、すべての剰余変数を含みます。このバージョンではcdは必要ありません。なぜなら、グロブはディレクトリが前に追加されるまで展開されないからです。最初のバージョンでは、グロブはディレクトリが前に追加される前に展開されます。

質問に示された方法でパイプを引用すると、二重引用符が引数に含まれます。私がそれを示す方法では、パイプ文字だけが渡されますが、参照された時点で変数が引用されているので保護されています。

+0

$ FILES変数のパイプ文字と数字は、ファイル名を引数として取るだけでなく、myexternalscript.shスクリプトで受け入れられる引数です。私はあなたのスクリプトを試しましたが、うまくいかず、文字通り .datを引数として渡しました。 – toop

+0

@toop:動作させるために必要な 'cd'コマンドを省略しました。私はそれを加えて、あなたの議論を含めるべきであるもう一つのバージョンを加えました。私はこれを行うより良い方法があると確信していますが、私はあなたの引数が "外側の"スクリプト(ハードコーディングされていない場合)にどのように引き出されているのかを見て、 「内部」スクリプトで消費されます。 –

関連する問題