文字列が一致する場合にのみファイルに出力するOneliner(bash)?

文字列が一致する場合にのみファイルに出力するOneliner(bash)?

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コマンドの出力を条件付きでバッファリングする方法がないため、ファイルに「バッファリング」せずにこれを実行できるかどうかはわかりません。

関連情報