如果文件以 bash 开头,我该如何删除它?

如果文件以 bash 开头,我该如何删除它?

如果文件本身以 开头,我需要一个 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 命令更冗长,但它

  1. 更易读
  2. 更具扩展性
  3. 无论您多么粗心,都不会被带有空格和 shell 元字符的文件名搞砸。

相关内容