find查找指定文件

[复制链接]
发表于 昨天 09:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
find 找文件的时候,终端里突然蹦出一堆 Permission denied,其实加一个 2>/dev/null 就干净了。这篇以查找 libncurses 为例,讲明白标准输出和错误输出的区别、/dev/null 这个黑洞文件的作用,顺带把几个常用的重定向写法收进来。

一、先用 find 查一个指定文件

以查找 libncurses 为例:把 /usr 目录里所有以 libncurses 开头的文件找出来。
  1. find /usr -name "libncurses*"
  2. 2>/dev/null
复制代码

二、1 和 2 到底指什么


  • 1> 或 >:标准输出(stdout),命令正常打印出来的结果,比如找到的文件路径
  • 2>:错误输出(stderr),命令执行过程中的报错信息,比如权限不足、目录不存在


三、/dev/null 是个丢数据的黑洞


  • /dev/null 是一个特殊的虚拟设备文件,往里写什么都会被直接丢弃,类似“黑洞”
  • 把错误输出重定向到 /dev/null(也就是 2>/dev/null),等于把所有错误信息藏起来


四、这里为什么非要加 2>/dev/null

在 find /usr -name "libncurses*" 这条命令里:


  • 正常情况:找到匹配文件,结果从 stdout 打出来
  • 可能遇到的错误:某些目录没有访问权限(比如 /usr/sbin 往往需要 root),还有某些子目录根本不存在
  • 加了 2>/dev/null 以后:用户只看得到成功的查找结果(文件路径),烦人的 Permission denied 之类报错被静默丢弃


五、加与不加的对比

不加 2>/dev/null,输出会把结果和错误混在一起:
  1. find /usr -name "libncurses*"
复制代码
输出大概是这样:
  1. /usr/lib/libncurses.so
  2. find: ‘/usr/sbin’: Permission denied
  3. /usr/lib/libncursesw.so
复制代码

加上 2>/dev/null,输出只剩有用结果:
  1. find /usr -name "libncurses*"
  2. 2>/dev/null
复制代码
  1. /usr/lib/libncurses.so
  2. /usr/lib/libncursesw.so
复制代码



六、几个扩展用法


  • 同时屏蔽错误和正常输出(很少用):
    1. find /usr -name "libncurses*"
    2. >/dev/null 2>&1
    复制代码
  • 只把错误存进文件:
    1. find /usr -name "libncurses*"
    2. 2>errors.log
    复制代码


七、一句话记住

命令片断作用2>/dev/null隐藏所有错误消息,保持输出简洁>/dev/null 2>&1隐藏所有输出(包括正常和错误)
检查系统库的时候,2>/dev/null 是常用小技巧,能避免无关的权限错误把关键信息淹掉。

记住 2 就是 stderr,这个数字背下来,重定向基本不会再写错。

编辑提示:反过来排查脚本失败原因时,把 2>/dev/null 去掉再跑一次,报错通常直接把问题点出来了。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表