使用find命令查找多个文件名,多种方法

场景描述:
打包过程中,有个场景就是要找到对应的class文件,但在java编译成class文件时会遇到一些内部类的情况,做到不多余获取类也缺少类
比如说这样的要找到

[root@localhost this]# ll
total 0
-rw-r--r--. 1 root root 0 May 30 16:37 Test$1.class
-rw-r--r--. 1 root root 0 May 30 16:37 TestC.class
-rw-r--r--. 1 root root 0 May 30 16:37 Test.class
[root@localhost this]# 

同过Test.java文件找到Test.class、Test$1.class但排除掉TestC.class,我找到的方法

#这个肯定会查出多余的文件
[root@localhost this]# find . -name  "Test*"
./Test.class
./TestC.class
./Test$1.class
# 这样才能查到合适文件
[root@localhost this]# find . -name  "Test.class" -or -name "Test$"*
./Test.class
./Test$1.class
#或者这样
[root@localhost this]#  find . -type f -iname "Test.class" -o -iname "Test$"*   
./Test.class
./Test$1.class
#或者这样
[root@localhost this]#  find . -type f \( -name "*Test.class" -o -name  "Test$"* \)
./Test.class
./Test$1.class
[root@localhost this]# 

展示的方式有很多种,当时使用时只找到了一种方式,所以学知识要活学活用

2.11 Combining Primaries With Operators
=======================================

Operators build a complex expression from tests and actions.  The
operators are, in order of decreasing precedence:

'( EXPR )'
     Force precedence.  True if EXPR is true.

'! EXPR'
'-not EXPR'
     True if EXPR is false.  In some shells, it is necessary to protect
     the '!' from shell interpretation by quoting it.

'EXPR1 EXPR2'
'EXPR1 -a EXPR2'
'EXPR1 -and EXPR2'
     And; EXPR2 is not evaluated if EXPR1 is false.

'EXPR1 -o EXPR2'
'EXPR1 -or EXPR2'
     Or; EXPR2 is not evaluated if EXPR1 is true.

表达式之间默认是与的关系,如-name .c -name path,符合条件的应该是path*.c的文件。

有时候可能会遇到一条命令想查找两个格式的文件,这个时候就需要用到或关系了。

find -name *.c -or -name *.h

适用于查找两种或以上扩展名文件
查找前目录下的所有.gz和.log结尾的文件

当前目录文件列表

[root@test test1]# ll
总用量 0
-rw-r--r-- 1 root root 0 4月  24 10:58 1
-rw-r--r-- 1 root root 0 4月  26 12:28 1.gz
-rw-r--r-- 1 root root 0 4月  26 12:28 1.gz.log
-rw-r--r-- 1 root root 0 4月  24 10:58 2
-rwxr-xr-x 1 root root 0 4月  26 12:53 c

#使用命令

# 使用-o
[root@test test1]# find . -type f \( -name "*.gz" -o -name "*.log" \)
./1.gz.log
./1.gz
[root@test test1]# find . -type f -iname "*.log" -o -iname "*.gz"            
./1.gz.log
./1.gz
# 使用默认的正则方式
[root@test test1]# find . -type f -regex '.*\(\.gz\|\.log\)'
./1.gz.log
./1.gz
# 采用posix-extended正则
[root@test test1]#  find . -type f -regextype posix-extended -regex '.*.(log|gz)'
./1.gz.log
./1.gz

原文:https://blog.csdn.net/remme123/article/details/41724159
https://blog.51cto.com/xoyabc/2108052

<think>好的,我现在需要回答用户关于如何使用find命令查找多种文件类型的问题。首先,我得回忆一下自己对find命令的了解。find是一个功能强大的命令行工具,用于在目录结构中搜索文件。用户的问题是关于同时查找多种文件类型,这可能需要使用到文件类型参数或者扩展名匹配。 首先,我应该考虑用户可能的场景。比如,用户可能需要在某个目录下同时查找.txt和.pdf文件,或者查找不同类型的文件如普通文件、目录等。这时候,需要了解如何组合多个条件来实现这个需求。 接下来,我需要确认find命令中用于指定文件类型的选项。记得find命令中,-type参数是用来指定文件类型的,比如f表示普通文件,d表示目录,l表示符号链接等。如果要查找多种类型,可能需要使用逻辑运算符,比如-o(OR)来组合多个-type条件。 例如,查找普通文件或者目录,可以使用find . -type f -o -type d 不过,这里需要注意的是,逻辑运算符的优先级问题,可能需要使用括号来组合条件。但是在命令行中使用括号需要转义或者用引号包裹,比如: find . \( -type f -o -type d \) 另外,用户可能指的是根据文件扩展名来查找多种类型。这时候,可以使用-name参数配合通配符,比如: find . -name "*.txt" -o -name "*.pdf" 这里同样需要使用-o来连接多个-name条件,表示OR逻辑。同时,每个-name参数后面都要跟上对应的模式。 还有可能用户想结合排除某些类型的情况,这时候可能需要使用-not或者!,比如排除临时文件: find . -type f \( -name "*.txt" -o -name "*.pdf" \) ! -name "*.tmp" 此外,需要提醒用户关于逻辑运算符的优先级问题,因为默认情况下,find中的条件是从左到右处理的,但使用括号可以明确优先级。比如,如果同时有多个条件组合,括号的使用就很重要。 另外,可以提到如何结合其他参数,比如-mtime(修改时间)、-size(文件大小)等,进一步细化搜索条件。例如,查找最近7天内修改过的.txt或.md文件: find . -type f \( -name "*.txt" -o -name "*.md" \) -mtime -7 还需要注意,-o和-a(AND)的使用,默认情况下,条件之间是AND关系,所以使用-o时需要用括号明确范围,避免逻辑错误。 最后,可能需要提醒用户测试命令时的安全措施,比如先使用-print或者-exec echo来预览结果,再执行实际操作,避免误操作。 总结一下,用户的问题需要分两种情况:按文件类型(如普通文件、目录)查找,或按扩展名查找。对于每种情况,使用不同的参数组合,并结合逻辑运算符来满足多种类型的需求。同时,需要注意转义括号和逻辑运算符的正确使用,确保命令按预期执行。</think>要使用`find`命令同时查找多种文件类型,可以通过 **逻辑运算符** 和 **条件组合** 实现。以下是两种常见场景的解决方案: --- ### 一、按文件类型查找(普通文件、目录、符号链接等) ```bash # 查找普通文件(f) 或 目录(d) find 路径 \( -type f -o -type d \) # 示例:在当前目录查找所有文件和目录 find . \( -type f -o -type d \) ``` **关键点:** 1. `-type f` 表示普通文件,`-type d` 表示目录,`-type l` 表示符号链接。 2. `-o` 表示逻辑 **OR**(默认条件间是 **AND** 关系)。 3. 括号 `\( ... \)` 用于明确逻辑分组,必须用反斜杠转义或单引号包裹。 --- ### 二、按扩展名查找(.txt、.pdf、.jpg等) ```bash # 查找 .txt 或 .pdf 文件 find 路径 \( -name "*.txt" -o -name "*.pdf" \) # 示例:在 /home 目录下查找所有 .md 和 .py 文件 find /home \( -name "*.md" -o -name "*.py" \) ``` **关键点:** 1. `-name` 匹配文件名,支持通配符 `*`。 2. 多个 `-name` 条件用 `-o` 连接。 --- ### 三、组合复杂条件(类型 + 扩展名 + 排除项) ```bash # 查找普通文件,且是 .txt 或 .csv,排除名为 temp 的文件 find . -type f \( -name "*.txt" -o -name "*.csv" \) ! -name "temp" ``` **参数解析:** - `!` 或 `-not`:逻辑 **NOT** - `-and`:逻辑 **AND**(默认可省略) --- ### 四、常用扩展用法 #### 1. 按时间过滤(查找最近7天修改的 .log 或 .tmp 文件) ```bash find /var/log \( -name "*.log" -o -name "*.tmp" \) -mtime -7 ``` #### 2. 按大小过滤(查找大于1MB的 .jpg 或 .png 文件) ```bash find ~/Pictures \( -name "*.jpg" -o -name "*.png" \) -size +1M ``` #### 3. 执行操作(删除所有 .tmp 或 .bak 文件) ```bash find . \( -name "*.tmp" -o -name "*.bak" \) -exec rm {} \; ``` --- ### 五、注意事项 1. **转义括号**:在命令行中使用 `\(` 和 `\)`,或在脚本中用单引号包裹 `'(-name ...)'`。 2. **测试命令**:先运行无操作的 `-print` 确认结果,再执行删除等危险操作: ```bash find . -name "*.tmp" -print ``` --- **总结公式:** ```bash find [路径] \( 条件1 -o 条件2 -o 条件3 \) [其他选项] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值