手始めに、複数のプロセスを開始できます。
tar -ztf file.tar.gz | while read FILENAME
do
(if tar -zxf file.tar.gz "$FILENAME" -O | grep -l "string"
then
echo "$FILENAME contains string"
fi) &
done
は( ... ) &
、新しいデタッチされた(読み取り:親シェルは子を待機しません)プロセスを作成します。
その後、アーカイブの抽出を最適化する必要があります。OSはすでにファイルアクセスをキャッシュしているはずなので、読み取りは問題ありません。ただし、tarはループが実行されるたびにアーカイブを解凍する必要があり、これは遅くなる可能性があります。アーカイブを一度解凍して結果を繰り返すと、次の場合に役立ちます。
local tempPath=`tempfile`
mkdir $tempPath && tar -zxf file.tar.gz -C $tempPath &&
find $tempPath -type f | while read FILENAME
do
(if grep -l "string" "$FILENAME"
then
echo "$FILENAME contains string"
fi) &
done && rm -r $tempPath
find
ここではtar
、文字列を検索するファイルごとに、のターゲットディレクトリにあるファイルのリストを取得するために使用されます。
編集:grep -l
ジムが指摘したように、物事をスピードアップするために使用します。差出人man grep
:
-l, --files-with-matches
Suppress normal output; instead print the name of each input file from which output would
normally have been printed. The scanning will stop on the first match. (-l is specified
by POSIX.)