Как я могу удалить файл, если он запускается с <HTML> в ударе?

Мне нужна команда удара для удаления всего файла, если сам файл начинается <html>.

Я не уверен лучший способ пойти об этом...

Контекст: Я загружаю серию файлов через вихревые запросы. Большая часть времени загрузки и обработка хорошо работает. Но другие времена запрос загрузки приводят к 404 по любой причине. Когда я получаю это, содержание загруженного файла начинается с тега HTML. Когда остальная часть моей обработки поражает этот файл, это зависает. Таким образом, я хочу выполнить команду до своей другой обработки кошке каждый из файлов и удалить файл, если это имеет этот тег HTML.

7
задан 28 October 2014 в 07:27

4 ответа

Для обращения к вопросу, который предложил Вам спрашивать этого, а не того, которого Вы на самом деле спросили:

завихрение может сказать Вам код статуса в дополнение к загрузке файла. Вы не должны проверять содержание файла на это. Пример того, как проверить состояние,

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

различные варианты, которые можно использовать с -w, документируются в руководство, и в зависимости от потребностей, можно хотеть расширить это, чтобы произвести больше информации и проанализировать ее и/или изменить проверку кода статуса для разрешения больше, чем просто 200.

20
ответ дан 16 November 2019 в 18:17

Я просто протестировал это, это работает.

Выполнение shopt первый , потому что мы не хотим анализировать ls :

shopt -s nullglob  

тогда используют простой удар 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
ответ дан 16 November 2019 в 18:17

Не каждая задача автоматизации должна быть сделана с оболочкой. Вот сценарий 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()

, Возможно, это является более подробным, чем эквивалентные команды удара, но это

    [еще 111] читаемый
  1. [еще 112] расширяемый
  2. Никогда попытка быть завинченным именами файлов с пробелами и метасимволами оболочки, однако небрежными, Вы.
1
ответ дан 16 November 2019 в 18:17

Вы могли использовать эту команду находки для удаления всех файлов, только содержащих только <html> шаблон в первой строке:

find . -type f -exec sh -c 'sed q "$0" | grep -qP "^<html>$" && rm "$0"' {} \;
12
ответ дан 23 November 2019 в 06:07

Другие вопросы по тегам:

Похожие вопросы: