URLをカールして次のファイルに出力するスクリプトを作成しています。
curl http://example.com/$1 > $1
含まれていないアイテムを無視する方法はありますか<head>
?もちろん、次のようにすることができます。
web="$(curl http://example.com/$1)"
if $(echo "$web" | grep -q "<head>"); then
printf "$web" > "$1"
fi
しかし、このスクリプトは複数回実行できるため、時間を節約したいと思います。
答え1
ファイルに保存してタグが含まれていない場合は、タグを削除してください。
curl "http://example.com/$1" >"$1"
! grep -qF '<head>' "$1" && rm "$1"
またはもう少し複雑にしたい場合は、
if curl "http://example.com/$1" | tee "$1" | ! grep -qF '<head>'
then
rm "$1"
fi
またはみんな最初に取得し、それから生成されたファイルを参照して削除します。
mkdir outdir # assuming this is not pre-existing
# iterates over all positional parameters
for path do
curl "http://example.com/$path" >outdir/"$path"
done
find outdir -type f ! -exec grep -qF '<head>' {} \; -delete
ただし、これはすべての既知のファイルを固定パスの下にインポートしたい場合にのみ機能します。
答え2
次のことができます。
grep -hIz '<head>' < <(curl -s "http://example.com/$1") > "$1" || rm "$1"
これにより、すべての出力が抑制されます。〜しない限り<head>
どのような場合に印刷するかが含まれます。みんな出力。一致するものがない場合は、とにかく空のファイルが生成されるため、削除する必要があります。
答え3
楽しみとして:
curl "http://example.com/$1" | tee temp | grep -q derp && cat temp; rm temp
カール出力をファイルに保存し、出力をgrepにパイプし、grepは出力を検索し、derp
見つかった場合はカールコマンドの内容をstdoutに出力します。derp
見つからない場合、スクリプト出力はありません。その後、一時ファイルが削除されます。
bash
コマンドの出力を条件付きでバッファリングする方法がないため、ファイルに「バッファリング」せずにこれを実行できるかどうかはわかりません。