如果在 bash 中以 <html> 开头,如何删除文件?

BeM*_*end 7 command-line bash rm

如果文件本身以 .bash 开头,我需要一个 bash 命令来删除整个文件<html>

我不确定解决这个问题的最佳方法......

上下文:我通过 curl 请求下载了一系列文件。大多数情况下,下载和处理工作正常。但其他时候,无论出于何种原因,下载请求都会导致 404。当我得到这些时,下载文件的内容以 html 标签开头。当我的其余处理遇到此文件时,它会挂起。所以我想在我的其他处理之前运行一个命令来 cat 每个文件并删除文件,如果它有这个 html 标签。

hvd*_*hvd 20

要解决促使您提出这个问题的问题,而不是您实际提出的问题:

除了下载文件外,curl 还可以告诉您状态码。您不需要为此检查文件的内容。如何检查状态的一个例子是

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

您可以使用的各种选项-w都记录在手册中,根据您的需要,您可能希望扩展它以输出更多信息并解析它,和/或更改状态代码的检查以允许仅 200 个以上。


Syl*_*eau 12

您可以使用此 find 命令删除仅包含<html>第一行中的模式的所有文件:

find . -type f -exec sh -c 'sed q "$0" | grep -qP "^<html>$" && rm "$0"' {} \;
Run Code Online (Sandbox Code Playgroud)

  • 如果任何文件名包含双引号,这将不起作用(并且至少在理论上是危险的)。使用 `-exec sh -c 'head -1 "$0" ...' {} \;` 更可靠。 (4认同)

Set*_*eth 8

我刚刚测试了这个,它有效。

shopt首先运行,因为我们不想解析ls

shopt -s nullglob  
Run Code Online (Sandbox Code Playgroud)

然后使用一个简单的 bashfor循环查找以 开头的文件<html>并删除它们:

for i in *; do if [ "$(head -n 1 "$i")" == '<html>' ]; then rm "$i"; fi; done  
Run Code Online (Sandbox Code Playgroud)

使用会更安全:

for i in *; do if [ "$(head -n 1 "$i")" == '<html>' ]; then rm -i "$i"; fi; done  
Run Code Online (Sandbox Code Playgroud)

rm删除任何文件前询问,以防万一。

请注意,这shopt不是严格需要的,但它可以防止在目录为空或碰巧名称中带有星号的文件时发生某些问题。