web-dev-qa-db-ja.com

bashで<html>で始まるファイルを削除するにはどうすればよいですか?

ファイル自体が<html>で始まる場合、ファイル全体を削除するbashコマンドが必要です。

これについて最善の方法がわからない...

コンテキスト:curl要求を介して一連のファイルをダウンロードします。ほとんどの場合、ダウンロードと処理は正常に機能します。しかし、ダウンロードリクエストが何らかの理由で404になる場合もあります。これらを取得すると、ダウンロードしたファイルのコンテンツはhtmlタグで始まります。残りの処理がこのファイルにヒットすると、ハングします。したがって、他の処理の前にコマンドを実行して、各ファイルをcatし、このhtmlタグがある場合はファイルを削除します。

7
BeMy Friend

実際に尋ねた質問ではなく、この質問をするように促した質問に対処するには:

curlは、ファイルのダウンロードに加えて、ステータスコードを通知できます。そのためにファイルの内容を確認する必要はありません。ステータスを確認する方法の例は次のとおりです。

status=$(curl -w '%{http_code}' "${url}" -o "${file}")
test "${status}" -eq 200 || rm -- "${file}"

-wで使用できるさまざまなオプションはマニュアルに記載されています。必要に応じて、これを拡張してより多くの情報を出力して解析したり、ステータスコードのチェックを変更して許可したりできます。わずか200以上。

20
hvd

このfindコマンドを使用して、最初の行に<html>パターンのみを含むすべてのファイルを削除できます。

find . -type f -exec sh -c 'sed q "$0" | grep -qP "^<html>$" && rm "$0"' {} \;
12
Sylvain Pineau

私はこれをテストしましたが、動作します。

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は厳密には必要ありませんが、ディレクトリが空であるか、名前にアスタリスクが含まれているファイルがある場合に特定の問題が発生するのを防ぐことに注意してください。

8
Seth

すべての自動化タスクをシェルで実行する必要はありません。代わりに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コマンドよりも冗長かもしれませんが、

  1. より読みやすい
  2. より拡張可能
  3. たとえあなたが不注意であっても、スペースやシェルのメタキャラクターを含むファイル名に決して邪魔されることはありません。
1
Siyuan Ren