繁体   English   中英

在bash / linux中,尝试从文件中满足特定条件的文件中删除以特定字符串开头的行

[英]Trying to delete lines beginning with a specific string from files where the file meets a target condition, in bash/linux

我正在编写一个bash脚本,它将每分钟运行两次。 我想要做的是找到包含指定字符串的指定目录中的所有文件,并搜索该文件列表并删除以不同的特定字符串开头的任何行(在这种情况下,

这是我到目前为止尝试过的,但是它们没有用:

ls -1t /the/directory | head -10 | grep -l "qualifying string" * | sed -i '/^<meta/d' *'
ls -1t /the/directory | head -10 | grep -l "qualifying string" * | sed -i '/^<meta/d' /the/directory'

我在标题-10中添加的唯一原因是,每次脚本运行时,它仅从查看10个最新文件开始。 我不想让它不必要地在整个目录中进行搜索,因为它会在一分钟内多次遍历并删除该行。

该脚本的运行目录必须不同于文件所在的目录。此外,如果文件中不存在"<meta"字符串,文件的修改日期是否会更改?

这部分命令有很多问题...

ls -1t /the/directory | head -10 | grep -l "qualifying string" * ...

首先,您似乎正在尝试通过管道传递ls ... | head -10的输出。 ls ... | head -10转到grep,这将导致grepls的输出中搜索“ qualification string”。 否则,您会转而为grep提供*作为命令行参数,从而导致grep搜索所有文件,而完全忽略lshead命令。

您可能想了解xargs命令,该命令读取stdin上的文件列表,然后针对该列表运行给定命令。 例如,您应该能够生成如下文件列表:

ls -1t /the/directory | head -10 | 
  xargs grep -l "qualifying string"

并将sed应用于这些文件:

ls -1t /the/directory | head -10 | 
  xargs grep -l "qualifying string" |
  sed -i 's/something/else/g'

使用sed修改文件将更新文件的修改时间。

您可以使用带有*字符的globbing来扩展文件名并循环浏览目录。

n=0
for file in /the/directory/*; do
    if [ -f "$file" ]; then
        grep "qualifying string" "$file" && sed -i '/^<meta/d' "$file"
        n=$((n+1))
    fi
    [ $n -eq 10 ] && break
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM