shell 如何对目录中的所有文件执行grep操作?

8cdiaqws  于 2023-10-23  发布在  Shell
关注(0)|答案(6)|浏览(136)

使用xenserver,我想对目录中的每个文件执行一个命令,从命令的输出中删除一些内容,并将其附加到一个文件中。
我很清楚我想使用的命令以及如何根据需要grep出字符串。
但我不清楚的是,我如何让它对每个文件执行这个命令,转到下一个,直到没有更多的文件被发现。

kokeuurv

kokeuurv1#

在Linux中,我通常使用此命令递归地grep获取目录中的特定文本:

grep -rni "string" *

哪里

  • r =递归,即在当前目录中搜索子目录
  • n =将行号打印到stdout
  • i =不区分大小写搜索
pxiryf3j

pxiryf3j2#

grep $PATTERN *就足够了。默认情况下,grep会跳过所有子目录。但是,如果你想通过grep来访问它们,那么grep -r $PATTERN *就是这样。

dohp0rv5

dohp0rv53#

使用find。说真的,这是最好的方法,因为这样你就可以真正看到它正在操作的文件:

find . -name "*.sql" -exec grep -H "slow" {} \;

注意,-H是Mac专用的,它在结果中显示文件名。

dl5txlt9

dl5txlt94#

要在所有子目录中搜索,但仅在特定文件类型中搜索,请使用grep和--include
例如,在当前目录中递归搜索 *.yml和 *.yaml中的文本:

grep "text to search" -r . --include=*.{yml,yaml}
rqqzpn5f

rqqzpn5f5#

如果要执行多个命令,可以使用用途:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
bz4sfanl

bz4sfanl6#

tldr:

grep -r --include=*.md --include=*.markdown --exclude-dir=node_modules "postgres"
grep -r -o --include=*.md --include=*.markdown --exclude-dir=node_modules "postgres"

我在Ubuntu上使用bash和GNU grep 3.7:

$ grep -V
grep (GNU grep) 3.7
Copyright (C) 2021 Free Software Foundation, Inc.

我想搜索扩展名为**.md.markdown**的文件中的任何内容。
第一个例子产生了这样的结果:

elves/_posts/2023-09-11-postgres.markdown:postgres
elves/_heroku-guide/HerokuDataStarter.md:https://elements.heroku.com/addons/heroku-postgresql
elves/_heroku-guide/HerokuDataStarter.md:heroku addons:create heroku-postgresql:hobby-dev
vendor/bundle/ruby/3.0.0/gems/zeitwerk-2.6.7/README.md:# my_gem/db_adapters/postgresql.rb

第二个:

elves/_posts/2023-09-11-postgres.markdown:postgres
elves/_heroku-guide/HerokuDataStarter.md:postgres
elves/_heroku-guide/HerokuDataStarter.md:postgres
vendor/bundle/ruby/3.0.0/gems/zeitwerk-2.6.7/README.md:postgres
vendor/bundle/ruby/3.0.0/gems/eventmachine-1.2.7/docs/GettingStarted.md:postgres
vendor/bundle/ruby/3.0.0/gems/zeitwerk-2.6.6/README.md:postgres

我发现以下内容很有帮助:

#! /bin/bash

GREP='grep -r --include=*.md --include=*.markdown --exclude=bundle.js etc...'

相关问题