grep を使用した Bash for ループ

grep を使用した Bash for ループ

forループを使用してプログラムを実行するコマンドを含む2番目のbashスクリプトに、パイプする圧縮ファイルでいっぱいのフォルダがあります。これまで私は以下を持っています:

targ_path='/scratch/mine/allfiles/targetfiles/'
mybashpath='/scratch/mine/secondbash.sh'
cd $targ_path                                               
ls | grep \.gz | $mybashpath {}

しかし、これが間違っていることを知っています。 forループを使用してファイルを2番目のbashスクリプトにパイプする必要があります。

私は初めてbashに触れたので、ここで助けてくれて本当にありがとう。

ベストアンサー1

意図がディレクトリを次に変更し$targ_path、そのディレクトリ$mybashpathで名前が終わる.gz各ファイルを引数として使用してスクリプトを一度呼び出すとします。

#!/bin/bash

shopt -s nullglob

targ_path=/scratch/mine/allfiles/targetfiles
mybashpath=/scratch/mine/secondbash.sh

cd "$targ_path" || exit

for name in ./*.gz; do
   "$mybashpath" "$name"
done

これによりディレクトリがに変更されますが、$targ_path失敗すると終了します。

./*.gz次に、ワイルドカードパターンと一致する名前(つまり、.で終わる現在のディレクトリのすべての名前)を繰り返します.gz。この名前を$mybashpathスクリプトの引数として使用して、各名前に対して一度スクリプトを呼び出します。

また、nullglobワイルドカードパターンが一致しない場合、ループが一度実行されないようにスクリプトの上部にシェルオプションを設定しました。

$mybashpathスクリプトがパラメータを使用する方法によっては、cdこれは不要な場合があります。

#!/bin/bash

shopt -s nullglob

targ_path=/scratch/mine/allfiles/targetfiles
mybashpath=/scratch/mine/secondbash.sh

for name in "$targ_path"/*.gz; do
   "$mybashpath" "$name"
done

おすすめ記事