grep --exclude 不起作用

本文介绍了在使用grep进行文件搜索时如何排除特定文件和目录的方法。通过`--exclude`和`--exclude-dir`选项可以排除单个文件或目录,但当涉及到子目录中的文件时,这种方法可能无效。解决办法是结合使用`find`和`xargs`命令,通过`find`查找所有文件并排除指定路径,然后利用`xargs`将结果传递给grep。这种组合方式能有效排除目标文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用 grep 查找的时候,如果想在查找范围中排除掉某个目录和文件,怎么做?

很简单,用 --exclude=xxxx 或者 --exclude-dir=xxxx(用于目录)

举例子

$ grep 1111 -r .

./a.txt:1111
./b.txt:1111111
./c.txt:11111222221

假如要排除掉文件 a.txt

$ grep 1111 --exclude=a.txt -r .

./b.txt:1111111
./c.txt:11111222221

假如要排除掉当前目录

$ grep 1111 --exclude-dir=./ -rn .

结果是啥也没有

需要注意的是:

$ grep 1111 --exclude=./a.txt -rn .
./a.txt:1:1111
./b.txt:1:1111111
./c.txt:1:11111222221

这样写不起作用
一定要写成
$ grep 1111 --exclude=a.txt -r .

但是,如果当前目录下还有子目录,我们想排除子目录中的某个文件
比如

$ find . -type f
./a.txt
./b.txt
./c.txt
./ss/s.txt  // 假设要排除这个

先试试用 --exclude 选项

$ grep 1111 --exclude="ss/s.txt" -rn .
./a.txt:1:1111
./b.txt:1:1111111
./c.txt:1:11111222221
./ss/s.txt:1:11116666


$ grep 1111 --exclude="./ss/s.txt" -rn . 
./a.txt:1:1111
./b.txt:1:1111111
./c.txt:1:11111222221
./ss/s.txt:1:11116666
learner@ubt:/mnt/hgfs/vm_share/grep_test$ 

不灵了。

这可怎么办呢?
各种尝试,都不行,最后试出了这样的方法:

$ find . -type f ! -path "./ss/s.txt" | xargs grep '1111' 
./a.txt:1111
./b.txt:1111111
./c.txt:11111222221

解释一下:
find . -type f 表示查找当前目录下的所有文件,含子目录
-path "./ss/s.txt" 表示用 find 查找的时候要排除掉的文件(可以用正则表达式) “./ss/s.txt”
xargs 表示把 find 命令的结果作为参数传递给 grep

【End】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值