[英]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,这将导致grep
在ls
的输出中搜索“ qualification string”。 否则,您会转而为grep提供*
作为命令行参数,从而导致grep搜索所有文件,而完全忽略ls
和head
命令。
您可能想了解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.