find之目录层级及过滤

参考博客:

大佬的详细博客

find过滤目录

忽略某些目录,可以使用-path 过滤的目录路径 -prune -o参数来进行过滤

比如查找/data/web/ssy/online路径下的的目录,并统计目录大小,以G位单位进行排序(默认为降序),并统计前10个大小的目录。命令如下:

# find /data/web/ssy/online/* -maxdepth 0 -type d -exec /usr/bin/du -sh {} \;|grep '[0-9]G'|sort -rh|head -10
 
查找/data/web/ssy/online路径下除tmp目录之外的目录,并统计目录大小,以G位单位进行排序(默认为降序),并统计前10个大小的目录。命令如下

# find /data/web/ssy/online/* -path /data/web/ssy/online/tmp -prune -o -maxdepth 0 -type d -exec /usr/bin/du -sh {} \;|grep '[0-9]G'|sort -rh|head -10

注意:

  1. “-maxdepth 0” 表示只查找到/data/web/ssy/online下的目录。如果是"-maxdepth 1"则表示查找到/data/web/ssy/online/xxx下的目录
  2. find命令中的过滤、忽略、排除使用-path 过滤的文件或目录-prune -o,其中-prune类似于if判断,如果-prune之前的语句为真,比如找到了前面-path指定的/data/web/ssy/online/tmp目录,就不再执行后面-o跟的语句了,如果没有找到则执行后面的语句。这样就做到了排除效果!
    其中的"-o" 是 “-or” 的意思!
  3. -path要过滤掉的文件或目录路径参数一定要紧跟在要搜索的路径之后,否则过滤效果就不会实现!!也就是说上面的"-path /data/web/ssy/online/tmp"必须紧跟着放在"/data/web/ssy/online/*"后面,否则查找时就不会过滤掉/data/web/ssy/online/tmp这个目录
  4. 当要搜索的目录不是全路径时,要过滤掉的目录必须是"./test2"才能实现过滤效果。如果是"test2"或者"./test2/"都不能实现过滤效果
  5. 当要搜索的目录是全路径时,要过滤掉的目录也必须是全路径才能实现过滤效果!要过滤掉的目录后面不能加"/",否则也不能实现过滤效果
find过滤文件

先查看对应文件,然后使用"grep -v"进行过滤,集合-maxdepth控制目录搜索层级

查找目录下的文件,并过滤某个文件

find . -maxdepth 1 -type f |grep -v "haha2"|grep -v haha3|grep -v haha4
控制搜索深度的选项

-maxdepth :指定遍历搜索的最大深度。最大目录层级

-mindepth: 指定开始遍历搜索的最小深度。最小目录层级

  • -maxdepth 0:最大目录层级为0,表示只针对当前目录本身(比如/opt/kevin)进行搜索操作或du -sh 统计操作。
  • -maxdepth 1:最大目录层级为1,表示针对/opt/kevin/ 路径进行搜索操作或du -sh 统计操作。
  • -maxdepth 2:最大目录层级为2,表示针对/opt/kevin/xxx/ 路径进行搜索操作或du -sh 统计操作。

但是如果当前路径加入"*"使用"-maxdepth 0" 效果和 当前路径不加"*"使用"-maxdepth 1" 是一样的!

find ./* -maxdepth 0 -type f

等价于

find . -maxdepth 1 -type f
<think>好的,用户问的是Linux中的find命令是否会自动搜索子目录。我需要先确认自己对find命令的理解是否正确。find命令默认的行为确实是递归搜索所有子目录,除非特别限制。不过,用户可能对find不太熟悉,所以需要解释清楚。 接下来,我应该考虑用户的潜在需求。他们可能是在处理文件管理任务时遇到了问题,或者想确认find的行为是否符合预期。用户可能没有明确说明,但深层需求可能是如何有效使用find命令,包括如何控制搜索深度。 需要分步骤解释,首先明确回答“是的,会搜索子目录”,然后说明默认行为,接着举例基本用法,再介绍如何限制搜索深度,比如使用-maxdepth参数。此外,可能还需要对比其他命令,比如ls或grep的不同,避免用户混淆。 要注意用户可能对命令行不太熟悉,所以例子要简单明了,比如查找当前目录及其子目录下的.txt文件,或者如何只搜索当前目录。同时,提醒用户参数的位置很重要,尤其是-print0这类选项的处理,避免语法错误。 最后,总结一下,确保用户明白find的递归特性,以及如何根据需要调整搜索范围。可能还需要提到常见使用场景,帮助用户更好地应用这个命令。</think>--- ### **是的,`find` 命令默认会递归搜索所有子目录。** --- ### **详细说明** #### **1. 默认行为** - `find` 命令的**核心功能**是递归遍历指定路径下的所有子目录,并搜索符合条件的文件/目录。 例如: ```bash find /home/user -name "*.txt" ``` 此命令会搜索 `/home/user` 及其所有子目录中的 `.txt` 文件。 #### **2. 如何限制搜索深度** 若需**不搜索子目录**,可通过 `-maxdepth` 参数限制搜索层级: ```bash find /home/user -maxdepth 1 -name "*.txt" ``` `-maxdepth 1` 表示仅搜索 `/home/user` 本身,不进入子目录。 --- ### **对比其他命令** | 命令 | 默认是否递归子目录 | 典型用途 | |---------------|--------------------|-----------------------------------| | `find` | **是** | 根据名称、类型、时间等条件搜索文件 | | `grep -r` | 是 | 递归搜索文件内容 | | `ls` | 否 | 仅列出指定目录的直接内容 | --- ### **常见用法示例** 1. **基础搜索** ```bash find . -name "file.conf" # 从当前目录递归查找名为 file.conf 的文件 ``` 2. **按类型过滤** ```bash find /var/log -type f -name "*.log" # 搜索 /var/log 及其子目录中的所有 .log 文件 ``` 3. **限制搜索层级** ```bash find /etc -maxdepth 2 -name "*.conf" # 仅搜索 /etc 及其下一级子目录 ``` --- ### **注意事项** - **路径参数的顺序**: `find` 的选项(如 `-maxdepth`)必须放在路径之前。 ❌ 错误写法:`find /path -name "*.txt" -maxdepth 1` ✅ 正确写法:`find /path -maxdepth 1 -name "*.txt"` - **符号链接处理**: 默认不跟随符号链接(避免死循环)。如需跟随,添加 `-L` 参数: ```bash find -L /path -name "target" ``` --- ### **总结** - `find` 默认递归搜索子目录,可通过 `-maxdepth` 限制层级。 - 灵活结合 `-name`、`-type`、`-size` 等条件实现精准搜索。 - 若需非递归操作,优先使用 `ls` 或 `grep`(根据场景选择)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值