ファイル自体が<html>
で始まる場合、ファイル全体を削除するbashコマンドが必要です。
これについて最善の方法がわからない...
コンテキスト:curl要求を介して一連のファイルをダウンロードします。ほとんどの場合、ダウンロードと処理は正常に機能します。しかし、ダウンロードリクエストが何らかの理由で404になる場合もあります。これらを取得すると、ダウンロードしたファイルのコンテンツはhtmlタグで始まります。残りの処理がこのファイルにヒットすると、ハングします。したがって、他の処理の前にコマンドを実行して、各ファイルをcatし、このhtmlタグがある場合はファイルを削除します。
実際に尋ねた質問ではなく、この質問をするように促した質問に対処するには:
curlは、ファイルのダウンロードに加えて、ステータスコードを通知できます。そのためにファイルの内容を確認する必要はありません。ステータスを確認する方法の例は次のとおりです。
status=$(curl -w '%{http_code}' "${url}" -o "${file}")
test "${status}" -eq 200 || rm -- "${file}"
-w
で使用できるさまざまなオプションはマニュアルに記載されています。必要に応じて、これを拡張してより多くの情報を出力して解析したり、ステータスコードのチェックを変更して許可したりできます。わずか200以上。
このfindコマンドを使用して、最初の行に<html>
パターンのみを含むすべてのファイルを削除できます。
find . -type f -exec sh -c 'sed q "$0" | grep -qP "^<html>$" && rm "$0"' {} \;
私はこれをテストしましたが、動作します。
shopt
を最初に実行します ls
を解析したくないため :
shopt -s nullglob
次に、単純なbash for
ループを使用して、<html>
で始まるファイルを見つけて削除します。
for i in *; do if [ "$(head -n 1 "$i")" == '<html>' ]; then rm "$i"; fi; done
使用する方が安全です:
for i in *; do if [ "$(head -n 1 "$i")" == '<html>' ]; then rm -i "$i"; fi; done
念のため、ファイルを削除する前にrm
に確認してもらいます。
shopt
は厳密には必要ありませんが、ディレクトリが空であるか、名前にアスタリスクが含まれているファイルがある場合に特定の問題が発生するのを防ぐことに注意してください。
すべての自動化タスクをシェルで実行する必要はありません。代わりにPythonスクリプトがあります
#!/usr/bin/env python
import os
def is_html_file(file_name):
# Actually, try/except is better
# But not very readable for someone not familiar with python
if not os.path.isfile(file_name):
return False
with open(file_name, 'rb') as f:
# A lot of HTML file starts with doctype
# It is better to check that too
return f.read(6) == '<html>'
def main():
# Use os.walk if recursion is needed
for fn in os.listdir('.'):
if is_html_file(fn):
print 'Removing', fn, '...'
os.remove(fn)
main()
同等のbashコマンドよりも冗長かもしれませんが、