
ディレクトリ(特定のファイル.biz)に5〜6個のファイルがあり、一度に1つずつ変数$fileに保存し、ディレクトリに.bizファイルが見つからなくなるまで一連のコマンドを適用したい場合はどうすればよいですか。管理する。
使ってみよう
for f in graham/quant
do
if grep "max" $file;
then
maximum.sh $file
elif grep "milan" $file;
then
milan.sh $file
elif grep "min" $file;
then
minimum.sh $file
.
.
.
else
echo " keep working you are close "
fi
done
ただし、プログラムは最初の有効な条件を持つすべてのファイルを実行します。
拡張子.bizのファイルが5つある場合、すべてのファイルは最初の有効な条件で5回実行されます。
出力は次のとおりです。
Milan
Milan
Milan
Milan
Milan
変える
Milan
Minimum
Maximum
.
.
どんなアイデアがありますか?
答え1
grep -lZ max graham/quant/*.biz | xargs -0r maximum.sh
grep -lZ milan graham/quant/*.biz | xargs -0r milan.sh
grep -lZ min graham/quant/*.biz | xargs -0r minimum.sh
grep
注:オプションで、NULで区切られたファイル名を出力するにはGNUが必要です-Z
。
この行では、目的のパターン(、、または)を含むファイルのリストを出力するgrep
オプションと、ファイル名を区別するためにNULを使用するオプションを使用します。-l
max
milan
min
-Z
どの有効な文字)。
xargs
これは、一致する各ファイルに対して適切なスクリプトが実行されるようにパイプで接続されます。
これらのスクリプトは、コマンドラインで複数のファイル名引数を正しく処理すると想定しています。そうでない場合は、オプション-n 1
に追加してください。xargs
例えばgrep -lZ max graham/quant/*.biz | xargs -0r -n 1 maximum.sh
からman grep
:
-l
、--files-with-matches
通常の出力を抑制します。代わりに、印刷は通常、各入力ファイルの名前を印刷します。検索は最初の一致で停止します。
そして:
-Z
、--null
通常、ファイル名の後に続く文字の代わりに0バイト(ASCII NUL文字)を出力します。たとえば、
grep -lZ
通常の改行ではなく、各ファイル名の後にゼロバイトを出力します。このオプションを使用すると、ファイル名に改行などの珍しい文字が含まれていても出力が明確になります。
find -print0
このオプションは、、、、などのコマンドとともに使用して、perl -0
任意 のファイル名(改行文字を含む名前も含む)を処理できます。sort -z
xargs -0
答え2
ユーザーが言ったように使用中です。古代UNIXシェル、別のバージョンのスクリプトを試してみましょう。
#!/bin/sh
#test version for ancient shell.
cd graham/quant
for file in *.biz
do
grep -q "max" "$file"
if [ "$?" = "0" ]; then
maximum.sh "$file"
fi
grep -q "milan" "$file"
if [ "$?" = "0" ]; then
milan.sh "$file"
fi
grep -q "min" "$file"
if [ "$?" = "0" ]; then
minimum.sh "$file"
fi
done
cd $OLDPWD