find命令详解

·find是Unix/Linux命令行工具箱中最棒的工具之一;该命令对于编写shell脚本所起到的功用不可小视,但是多数人却无法最大程度发挥它的功效。下面讨论find的大多数常见用法。
·find命令的工作方式:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作
·要列出当前目录及子目录下所有的文件和文件夹,可以采用下面的写法:
find . -print # 打印文件和目录的列表
.指定当前目录,… 指定父目录。这是Unix文件系统中的约定用法。
-print指明打印出匹配文件的文件名(路径)。当使用 -print时,’\n’作为用于对输出的文件名进行分隔。就算你忽略-print,find命令仍会打印出文件名。
-print0指明使用’\0’作为匹配的文件名之间的定界符。当文件名中包含换行符时,这个方法就有用武之地了。

1 . 根据文件名进行搜索
find / -name " *.txt"
选项–name的参数指定了文件名所必须匹配的字符串。我们可以将通配符作为参数使用。*.txt能够匹配所有以.txt结尾的文件名。
·find命令有一个选项 -iname(忽略字母大小写),该选项的作用和 -name类似,只不过在匹配名字时会忽略大小写。

 ls
 file FILE
 find . -iname file
./FILE
./file

如果想匹配多个条件中的一个,可以采用OR条件操作:

ls
new.txt some.jpg text.pdf
find . \( -name "*.txt" -o -name "*.pdf" \) -print
./text.pdf
./new.txt 

上面的代码会打印出所有的.txt和.pdf文件,是因为这个find命令能够匹配所有这两类文件。\ (以及\ )用于将 -name " * .txt" -o -name "*.pdf"视为一个整体。
·选项-path的参数可以使用通配符来匹配文件路径。-name总是用给定的文件名进行匹配。
-path则将文件路径作为一个整体进行匹配。例如:

find /home/users -path "*/slynux/*" -print
/home/users/list/slynux.txt
/home/users/slynux/eg.css 

选项-regex的参数和-path的类似,只不过-regex是基于正则表达式来匹配文件路径的。

ls
1.py 2.py  s1.sh s2.sh s3.sh
find . -regex ".*\(\.py\|\.sh\)$"
./2.py
./s1.sh
./s3.sh
./s2.sh
./1.py

-iregex可以让正则表达式忽略大小写。例如:

find . -iregex ".*\(\.py\|\.sh\)$"
./1.py
./1.PY 

2.否定参数
find也可以用“!”否定参数的含义。例如:

$ls
list.txt  new.txt next.jpg 
 find . ! -name "*.txt" -print
./next.jpg 

3 . 基于目录深度的搜索
·find命令在使用时会遍历所有的子目录。我们可以采用深度选项-maxdepth和 -mindepth
来限制find命令遍历的目录深度。
·大多数情况下,我们只需要在当前目录中进行搜索,无须再继续向下查找。对于这种情况,我们使用深度选项来限制find命令向下查找的深度。如果只允许find在当前目录中查找,深度可以设置为1;当需要向下两级时,深度可以设置为2;其他情况可以依次类推。
-maxzdepth指定最大深度;-mindepth设置最小深度
find . -maxdepth 1 -name "f*"
该命令列出当前目录下的所有文件名以f打头的文件。即使有子目录,也不会被打印或遍历。
·打印出深度距离当前目录至少两个子目录的所有文件:

 find . -mindepth 2 -name "f*" -print
./dir1/dir2/file1
./dir3/dir4/f2

即使当前目录或dir1和dir3中包含有文件,它们也不会被打印出来。

4.根据文件类型搜索
Unix类系统将一切都视为文件。文件具有不同的类型,例如普通文件、目录、字符设备、块设备、符号链接、硬链接、套接字以及FIFO等。
-type可以对文件搜索进行过滤
只列出当前所有的目录:
find . -type d
只列出普通文件:
find . -type f
只列出符号链接:
find . -type l
文件类型表

文件类型类型参数
普通文件f
符号连接l
目录d
字符设备c
块设备b
套接字s
FIFOp

5.根据文件时间进行搜索
Unix/Linux文件系统中的每一个文件都有三种时间,如下所示。
访问时间(-atime):用户最近一次访问文件的时间。
修改时间(-mtime):文件内容最后一次被修改的时间。
变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。
它们可以用整数值指定,单位是天。这些整数值通常还带有 - 或 + :- 表示小于,+ 表示大于。
·打印出在最近2天内被访问过的所有文件:
find . -type f -atime -2
·打印出恰好在3天前被访问过的所有文件:
find . -type f -atime 3
打印出访问时间超过7天的所有文件:
find . -type f -atime +7
·还有其他一些基于时间的参数是以分钟作为计量单位的
-amin(访问时间); -mmin(修改时间);-cmin(变化时间)。
打印出访问时间超过10分钟的所有文件:
find . -type f -amin +10

6 . 基于文件大小的搜索
查找大于2KB的文件:
find . -type f -size +2k
查找小于2KB的文件:
find . -type f -size -2k
查找等于2KB的文件:
find . -type f -size 2k
其他文件大小单元:

字符大小
b快(512字节)
c字节
w字(2字节)
K1024字节
M1024K字节
G1024M字节

7 . 删除匹配的文件
-delete可以用来删除find查找到的匹配文件。
删除当前目录下所有的 .swp文件:
find . -type f -name "*.swp" -delete

8 . 基于文件权限和所有权的匹配
-perm指明find应该只匹配具有特定权限值的文件
查找644权限文件:
find . -type f -perm 644
Web服务器上的PHP文件需要具有合适的执行权限。我们可以用下面的方法找出那些没有设置好执行权限的PHP文件:
find . -type f -name "*.php" ! -perm 644
用选项 -user USER就能够找出由某个特定用户所拥有的文件;参数USER可以是用户名或UID。
打印出用户Lucy拥有的所有文件:
find . -type f -user Lucy -print

9 . 利用find执行命令或动作
find命令可以借助选项-exec与其他命名进行结合。-exec算得上是find最强大的特性之一。
将某位用户(比如root)全部文件的所有权更改成另一位用户,那么就可以用 -user找出root拥有的所有文件,然后用-exec更改所有权。
find . -type f -user root -exec chown Lucy {} \;
将10天前的 .txt文件复制到A目录中:
find . -type f -mtime +10 -name "*.txt" -exec cp {} A \;

注:参考Linux Shell 脚本攻略:第二版 :人民邮电出版社

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值