Мне нужна команда удара для удаления всего файла, если сам файл начинается <html>
.
Я не уверен лучший способ пойти об этом...
Контекст: Я загружаю серию файлов через вихревые запросы. Большая часть времени загрузки и обработка хорошо работает. Но другие времена запрос загрузки приводят к 404 по любой причине. Когда я получаю это, содержание загруженного файла начинается с тега HTML. Когда остальная часть моей обработки поражает этот файл, это зависает. Таким образом, я хочу выполнить команду до своей другой обработки кошке каждый из файлов и удалить файл, если это имеет этот тег HTML.
Для обращения к вопросу, который предложил Вам спрашивать этого, а не того, которого Вы на самом деле спросили:
завихрение может сказать Вам код статуса в дополнение к загрузке файла. Вы не должны проверять содержание файла на это. Пример того, как проверить состояние,
status=$(curl -w '%{http_code}' "${url}" -o "${file}")
test "${status}" -eq 200 || rm -- "${file}"
различные варианты, которые можно использовать с -w
, документируются в руководство, и в зависимости от потребностей, можно хотеть расширить это, чтобы произвести больше информации и проанализировать ее и/или изменить проверку кода статуса для разрешения больше, чем просто 200.
Я просто протестировал это, это работает.
Выполнение 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
не строго необходимо, но это препятствует тому, чтобы определенные вопросы произошли, если каталог пуст или там, оказывается, файл со звездочкой на ее имя.
Не каждая задача автоматизации должна быть сделана с оболочкой. Вот сценарий 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()
, Возможно, это является более подробным, чем эквивалентные команды удара, но это
Вы могли использовать эту команду находки для удаления всех файлов, только содержащих только <html>
шаблон в первой строке:
find . -type f -exec sh -c 'sed q "$0" | grep -qP "^<html>$" && rm "$0"' {} \;