如果文件本身以 开头,我需要一个 bash 命令来删除整个文件<html>
。
我不确定解决这个问题的最佳方法是什么......
上下文:我通过 curl 请求下载了一系列文件。大多数时候,下载和处理工作都正常。但有时下载请求会因为某种原因导致 404。当我收到这些请求时,下载文件的内容以 html 标记开头。当我的其余处理遇到此文件时,它会挂起。因此,我想在其他处理之前运行一个命令来 cat 每个文件并删除该文件(如果该文件有此 html 标记)。
答案1
为了解决促使您提出这个问题的问题,而不是您实际提出的问题:
除了下载文件之外,curl 还可以告诉您状态代码。您无需为此检查文件的内容。检查状态的示例如下
status=$(curl -w '%{http_code}' "${url}" -o "${file}")
test "${status}" -eq 200 || rm -- "${file}"
手册中记录了您可以使用的各种选项-w
,并且根据您的需要,您可能希望扩展它以输出更多信息并进行解析,和/或更改状态代码的检查以允许超过 200。
答案2
您可以使用此 find 命令删除仅包含<html>
第一行模式的所有文件:
find . -type f -exec sh -c 'sed q "$0" | grep -qP "^<html>$" && rm "$0"' {} \;
答案3
我刚刚测试过,它有效。
先跑shopt
因为我们不想解析ls
:
shopt -s nullglob
然后使用一个简单的 bashfor
循环来查找以以下内容开头的文件<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
不是严格需要的,但如果目录为空或者文件名称中带有星号,它可以防止发生某些问题。
答案4
并非所有自动化任务都应该使用 shell 完成。下面是一个 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 命令更冗长,但它
- 更易读
- 更具扩展性
- 无论您多么粗心,都不会被带有空格和 shell 元字符的文件名搞砸。