博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell编程:linux命令——find详解
阅读量:6257 次
发布时间:2019-06-22

本文共 2770 字,大约阅读时间需要 9 分钟。

  hot3.png

当系统子目录或文件越来越多时,查找文件比较困难,这时可以借助find工具查找满足条件的文件。

一、语法格式:

    find [path] [expression] [action]

path参数为指定find所要查找的目录的起点。

    可以同时指定多个目录作为搜索的起点,甚至可以指定根目录/作为起点搜索整个文件系统。
    若没有指定path参数,默认为当前工作目录。

expression表示若干个搜索条件,如文件名-name,修改时间-mtime等等

action表示指定对搜索到的文件执行操作,如-print打印到标准输出,-exec执行某种命令等等

[root@mrhcatxq01 shell]# find -name \*.unl       #默认在当前工作目录及其子目录下查找

./f.unl
./e.unl
./d.unl
./a.unl
./a/aa.unl
./b.unl
./c.unl
[root@mrhcatxq01 shell]# find . -name \*.unl      #指定在当前工作目录及其子目录下查找
./f.unl
./e.unl
./d.unl
./a.unl
./a/aa.unl
./b.unl
./c.unl
[root@mrhcatxq01 shell]#
[root@mrhcatxq01 shell]# find . ./a -name \*.c      #指定在当前工作目录和当前工作子目录a及其它们的子目录下查找
./a/ss.c
./a/ss.c
[root@mrhcatxq01 shell]#
rm -rf ./a/ss.c;rm -rf ./a/s2.c;
[root@mrhcatxq01 shell]# find ./a -name \*.c -print -exec rm -rf {} \;
./a/ss.c
[root@mrhcatxq01 shell]# ls -l ./a/ss.c
ls: cannot access ./a/ss.c: No such file or directory
[root@mrhcatxq01 shell]# find . ./a -name \*.c
[root@mrhcatxq01 shell]#

find ./a -name \*.c -print -exec rm -rf {} \;

以上find命令,在当前目录的子目录a及子目录a的子目录中查找,文件名以.c结尾的文件,然后将找到的文件输出到屏幕,再删除文件。
-exec可以指定对找到的文件执行的命令,此处是rm -rf {},{}表示每一个搜索到的符合条件的文件。
-exec执行命令时需要命令行结束的标识符,而shell通常使用;来标识命令行结束。
由于;对shell来说是特殊字符,需要转义,所以在;前加\转义。也可以使用如下命令实现转义(双引号或单引号):
[root@mrhcatxq01 shell]# touch ./a/ss.c
[root@mrhcatxq01 shell]# find ./a -name \*.c -print -exec rm -rf {} ";"
./a/ss.c
[root@mrhcatxq01 shell]# touch ./a/ss.c
[root@mrhcatxq01 shell]# find ./a -name \*.c -print -exec rm -rf {} ';'
./a/ss.c
[root@mrhcatxq01 shell]#

示例:

1.find . -iname "*.h" -print -exec mv {} ./b \;
[root@mrhcatxq01 shell]# find . -iname "*.h" -print -exec mv {} ./b \;
./a/test22.H
./b/ss.H
mv: `./b/ss.H' and `./b/ss.H' are the same file
./b/ss.h
mv: `./b/ss.h' and `./b/ss.h' are the same file
./b/test22.H
mv: `./b/test22.H' and `./b/test22.H' are the same file
./test11.h

-iname在匹配文件时不区分大小写

-print搜索到的文件打印到屏幕
-exec执行命令,此处执行 mv {} ./b  ,{}标识搜索到的文件,;标识命令行结束,如mv ./a/test22.H ./b;

2.find . -type f -mtime +5 -print

.表示在当前工作目录及其子目录下查找
-type表示指定文件类型,f表示普通文件,若要查找目录使用d
-mtime表示指定修改时间,+5表示5天前,-5表示5天内,5表示修改时间等于5天
-print表示将搜索到的文件名输出到屏幕

二、常用选项:

-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件,- n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前
-type 查找某一类型的文件,如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size nM 按nM大小查找文件
-amin n  查找系统中n分钟访问的文件
-atime n 查找系统中n*24小时(n天)访问的文件
-ctime n 查找系统中n*24小时(n天)创建的文件
-mmin n  查找系统中n分钟被改变数据的文件

基于目录的深度搜索

find命令在用时会遍历所有的子目录,我们可以采用一些参数来限制其遍历的深度
-maxdepth:最大深度限制,1表示只在当前目录,2表示两级目录(当前及仅当前的子目录,不包括子目录的子目录)...
find . -maxdepth 1 -type f -print     #只列出当前目录下的所有普通文件

三、逻辑运算符

-a 且;-o 或;!非
[root@mrhcatxq01 shell]# find . -maxdepth 1 -name "*.sh" -o -iname "*.h"
./teste.sh
./testa.sh
./8.sh
[root@mrhcatxq01 shell]#

转载于:https://my.oschina.net/shw23/blog/691274

你可能感兴趣的文章
一花一世界 一叶一菩提
查看>>
Python练习(day7)
查看>>
网络工程师笔试题总结
查看>>
我的友情链接
查看>>
C# DataTable的詳細用法
查看>>
vSphere网络原理及vSwitch
查看>>
df 命令
查看>>
jQuery 简介
查看>>
红帽新RHEL 7.1企业版发布
查看>>
Linux中的帮助功能
查看>>
Linux学习笔记——程序包管理之yum
查看>>
SqlServer转换为Mysql的一款工具推荐(mss2sql)
查看>>
go装饰模式,一个屌丝撸管的故事
查看>>
学习设计模式——命令模式
查看>>
【POJ】第一章 C/C++语言概述
查看>>
如何封装自己的js类库
查看>>
项目管理小小知识点总结
查看>>
ASP.NET之Javascript脚本的应用
查看>>
vlan间的互通
查看>>
ldconfig详解
查看>>