`
DiaoCow
  • 浏览: 243700 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Find命令实战

阅读更多
话说linux中我最常用的几个命令就是awk, grep, vim, find,今天我们就来详细看下find命令的使用

先来一个简单例子:
find . -name "*.java"  # 递归查找当前目录下所有java文件

其中:
. 表示查找路径为当前目录(你也可以指定为其他工程目录,譬如:~/workspace/login)
-name 表示搜索的目标文件名或目录名(允许使用shell通配符)

通常上述命令已经能够完成你日常工作需求的80%,但是要想完成另外的20%,你必须再深入了解下find命令...

现在假设你需要查找Test.java 和 TEST.java这两个文件,这时候你该如何做?
也许你会find . -name "Test.java" 和 find . -name "TEST.java" 执行两遍

虽然这样做结果正确,但是有没有更简单的方式呢? 答案,自然有
find . -iname "test.java" 	# -iname 与-name参数含义一样,但是忽略大小写

发现没,是不是更优雅了...

现在我们更进一步,假设我们需要列出~/scripts目录下所有名为study的文件该如何做呢?

在不了解find命令之前,也许你需要使用shell for循环来递归遍历目录,然后对每个找到的study判断是否为文件(有可能是名为study的目录),若确实是文件则输出. 说了这么多,这个方式真的是繁琐异常,但是如果你了解find命令,那么just one line!
find ~/scripts -type f -name "study"

其中-type参数用来指定搜索的目标类型,f表示普通文件,-type还有其他常用的参数值:f-文件, d-目录

现在你已经了解了:
1.如何指定find搜索路径
2.如何指定find搜索的目标类型(-type)
3.如何指定find搜索的文件名或是目录名(-name / -iname)

真是不少东西了呢,不过我们要继续前行,find命令还有很多很有用的参数。

find命令默认是递归搜索,它的搜索算法应该是我们常说的深度优先遍历(可以通过指定-depth参数指定采用广度优先遍历算法),但是有时候我们希望仅在当前目录搜索,或是能够指定递归查找的深度,这时候该如何做呢? 两个字简单

-maxdepth: 指定递归查找时的目录最大深度,若为1,表示仅在当前目录查找
-mindepth: 指定递归查找时的目录最小深度

现在我们看两个例子(先不要尝试去运行):
find . -name "*.java" -maxdepth 3
find . -maxdepth 3 -name "*.java"

这两个命令看似没有什么差异,但是运行效果确相差万里(特别是当文件很多目录又非常深时),或者在有的机器上第一种形式根本无法运行,原因为什么呢?

因为第一个命令它首先会找出所有java文件,然后再筛选出满足深度条件的文件,这样效率非常非常之低,而第二个命令则仅仅是在1-3层目录下搜索目标文件,而没有对整个文件树进行递归遍历,所以效率很高.

在我的机器上执行第一种命令,弹出以下警告:
find: warning: you have specified the -maxdepth option after a non-option argument -name, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.


好了,你现在你的手上又多了两把利器 -maxdepth 和 -mindepth(这个两个参数,可以提高你的查找效率以及zhuangbility)

find命令还几个很有用的参数
-mtime: 文件内容最后修改时间
-atime: 文件最后访问时间
-ctime: 文件meta信息最后修改时间(譬如文件权限)

这几个参数后面需要跟一个整型值使用,eg:
find . -mtime 1  -name "*.java"  	# 在当前目录下递归查找距离现在整1天修改的java文件
find . -mtime -1 -name "*.java"  	# 在当前目录下递归查找1天内修改的java文件
find . -mtime +1 -name "*.java"  	# 在当前目录下递归查找1天前修改的java文件

如果你需要查找某个时间段内的修改的文件,这些命令就非常有效了(搞运维的同学应该经常使用)

说了这么多参数(-name, -iname, -type, -mindepth, -maxdepth, -mtime等等),想必你对find命令已经有所了解,
现在我们来看看find命令的一个好基友----xargs

通常我们需要对查找出来的文件执行某些action,譬如我想查找某个工程目录下所有使用到StringUtils的java文件,这时候该怎么办呢?

方法1我们可以使用eclipse的搜索,方法2我们可以编写脚本,方法3 just one line ...

find ~/worksapce/project -name "*.java" | xargs grep "StringUtils"  

其中:
find ~/worksapce/project -name "*.java" 将会在家目录下workspace/project中递归查找所有java文件
xargs grep "StringUtils" 表示在文件中(find命令查找出的结果集)查找含有StringUtils字样的文件

也许有人一开始会这样写:find ~/worksapce/project -name "*.java" | grep "StringUtils"
这个命令执行将不会产生任何结果,而原因就是因为没有使用xargs!

现在我们就来说说xargs:xargs是用来把输入流转化为参数的命令(默认把输入流中的空白字符譬如"\n"(换行)替换成" "(空格))
$ cat test 
a
b
c
d
e
$ cat test | xargs
a b c d e

find命令将查找出的每一个文件名或目录名默认用"\n"分割,然后通过管道 | 作为输入流传递给grep命令,但是grep命令要求输入流必须是参数的形式,譬如:grep "target" file1 file2 所以必须使用xargs重新将输入流转换为参数

说到这里,一些比较严谨的同学也许会说,这样的命令:find ~/worksapce/project -name "*.java" | grep "StringUtils" 是不严谨,不安全的(这里还谈不上不安全,毕竟只是一个grep命令,但要是变成xargs rm -rf 那就危险了),原因就是find命令默认用"\n"分隔结果列表,而xargs会把"\n"转化成空格,所以当文件路径或者文件名含有"\n"这些字符时,就会被错误替换,这时候你在执行个rm -rf ,哦, 卖糕的...

所以我们应该养成好习惯,这样写
find ~/worksapce/project -name "*.java" -print0 | xargs -0 grep "StringUtils"

-print0用'\0'(空字符)分隔结果列表,xargs -0 只会将'\0' 替换成空格,这样就不会出现刚才所说的问题了....


关于find命令,我就说到这里,赶紧尝试吧...






0
1
分享到:
评论

相关推荐

    物联网工程运维之Shell脚本–find命令实战(预备知识)

    一、运维常用命令: 清屏:clear 连续回车——看命令更清晰 mkdir abc:创建文件夹abc touch abc:创建文件abc chmod 755 abc:改变权限,使管理员对abc有读、写、执行权限;而属组用户和其他用户只有读、执行权限。...

    Linux运维命令实战

    ### Linux运维命令实战知识点详解 #### 一、基础命令概览 在《Linux运维命令实战》这份资料中,作者详细地列举并解释了一系列基础Linux命令及其应用场景,这对于初学者和有一定经验的用户来说都是非常宝贵的资源。 ...

    Linux命令实战手册ss.pdf

    ### Linux命令实战手册ss.pdf知识点解析 #### 一、Linux操作系统概述 - **起源与发展**:Linux操作系统起源于1991年10月,由芬兰程序员Linus Torvalds开发,初衷是作为个人兴趣项目,旨在创建一个免费且开源的操作...

    DOS命令详解 DOS实例学习

    - `FIND`:在文件中搜索特定文本,如`FIND "keyword" file.txt`。 - `DIR /S`:搜索当前目录及其所有子目录中的文件。 6. **批处理** - `BAT`或`.CMD`文件:编写批处理脚本,批量执行命令,如`RUN batchfile.bat...

    linux实战常用命令

    Linux 实战常用命令涵盖了系统管理员在日常工作中的操作,包括文件和目录管理、文本处理、网络配置和诊断、系统监控等。以下详细知识点将帮助新手快速掌握Linux系统中的一些基础但极其重要的命令。 1. 文件和目录...

    Centos 7下的操作命令

    ### CentOS 7 下的 Find 命令详解 #### 一、Find 命令概述 `find` 命令是在 Linux 或类 Unix 操作系统中非常强大的一个工具,用于搜索文件系统中的文件。它提供了多种选项来精确地定位符合特定条件的文件。 #### ...

    LInux find使用

    ### Linux Find 命令详解 #### 概述 `find` 命令是 Linux 系统中一个非常强大的工具,用于在指定目录及其子目录下查找文件或目录。通过使用不同的选项,用户可以非常精确地定位到所需的文件。 #### 基本语法 ```...

    Shell编程高级进阶系列视频.zip

    17Linux下Shell编程FIND、SED命令实战 18Linux下Shell编程FIND、SED命令实战 19Shell编程之awk、sed演练 20Shell编程之awk、sed演练( 21Shell编程grep正则实战讲解 22Shell编程grep正则实战讲解 23Shell脚本综合案例...

    Linux实战运维命令一句话-非常强大的组合命令.doc

    以下是一些基于提供的文件内容的Linux实战运维命令和知识点的详细解释: 1. **删除0字节文件**: 使用`find`命令查找所有0字节大小的文件,并通过`-exec`选项与`rm -rf`结合删除它们。这可以帮助清理无用的空文件...

    浅谈find命令下的atime,ctime,mtime

    ### 浅谈find命令下的atime, ctime, mtime 在Linux系统中,`find`命令是一项极其强大的工具,用于在目录结构中搜索文件并执行特定操作。它提供了多种查找条件,使得用户能够根据不同的需求精确地定位到所需的文件。...

    CMake实战.pdf

    例如,`PROJECT`命令用于定义项目名称和使用的语言,`SETMESSAGE`用于设置和显示变量,`ADD_EXECUTABLE`用于创建可执行文件,`ADD_LIBRARY`用于创建库(静态库或动态库),`INSTALL`指令用于指定安装目标,`FIND_...

    Linux从零入门实战-2019年七月Z线.txt

    知识点5: find 与 grep:搜索神器find命令基本用法 知识点6: tar命令 知识点7: ssh和sshd 实战项目: ssh登陆到你的Linux系统,使用find、grep、tar等常用命令解决具体问题 第二阶段 Linux开发基础与shell编程 ...

    Linux系统基本命令

    - 示例命令:`find . -name "*.txt"` - 作用:在当前目录及其子目录中查找所有扩展名为.txt的文件。 - 实战场景:批量处理某一类文件,例如备份所有文本文件。 - **diff**:比较两个文件的内容差异。 - 示例...

    linux C实战

    - **命令行操作**:熟悉常见的Linux命令,如`ls`, `cd`, `mkdir`, `rm`, `cp`, `mv`, `grep`, `find`, `sed`等,以及管道`|`和重定向`>`、`的使用。 - **权限管理**:理解Linux的用户和组概念,以及文件的读、写、...

    LINUX命令 帮助文档

    ### Linux Find 命令详解 #### 概述 `find` 命令是 Linux 系统中一个非常强大的工具,用于在指定目录及其子目录下查找文件或目录。与 Windows 中的文件搜索功能不同,`find` 命令提供了更多的灵活性和选项,使用户...

    SELENIUM 2 自动化测试实战 基于PYTHON语言

    4. **元素定位**:Selenium提供了多种定位元素的方法,如`find_element_by_id`, `find_element_by_name`, `find_element_by_xpath`等。了解这些方法及其用法是编写测试脚本的基础。 5. **页面对象模型(Page Object...

    《MongoDB实战》第2版-第2章-JavaScript命令操作Mongodb1

    在《MongoDB实战》第二版的第二章中,作者主要讲解了如何通过JavaScript Shell操作MongoDB,包括基本的CRUD(创建、读取、更新、删除)操作、构建索引和使用`explain()`方法来优化查询,以及一些基础的数据库管理...

    菜鸟入门dos命令速成

    5. `find`:搜索文件内容,找到含有特定字符串的文件。 6. `ren`:批量重命名文件。 【DOS实战应用】: 1. 文件管理:通过`dir`、`copy`、`del`等命令,可以高效地查找、复制和删除文件。 2. 系统修复:在系统无法...

    LR性能测试实战之监控服务器系统资源

    1. 验证服务器上是否已经配置了 rstatd 守护程序,可以使用 rup 命令或 find 命令来检查。 2. 如果服务器上没有安装 rstatd,则需要安装。安装步骤包括获得 rstatd 的安装介质、解压缩、编译安装等。 3. 如果系统...

    mongodb实战中文pdf

    在MongoDB中,这些操作通过简单的命令和API实现,例如`insertOne()`、`find()`、`updateOne()`和`deleteOne()`。 3. **查询语言**:MongoDB的查询语言(MQL)支持丰富的查询选项,包括条件查询、排序、分组和聚合,...

Global site tag (gtag.js) - Google Analytics