欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux 的find命令

程序员文章站 2024-02-23 17:22:16
...

 

find命令用于查找文件和目录,任何位于参数之前的字符串都将被视为欲查找的目录。

 

find 可以指定查找条件如名称,类型,时间,文件大小,权限和所有者查找,针对多个条件进行与或非的逻辑运算。我们可以控制find的查找的行为,还可以和其他命令组合使用。

 

 

find 
find .
find . -print
 

 

 

三者等效, 查找当前目录下所有的文件和目录(递归子目录),以每行一个文件或者目录的形式列举出,不包含隐藏文件

 

 

find lib opt bin
 

 

 

同上,查找指定的多个目录(lib/opt/bin)

 

(1) 指定查找条件

 

1) 按名称查找

 

 

find . -name readme.txt
 

 

查找当前目录下(递归子目录)的所有名为readme.txt的文件

 

 

find . -name \*.txt
find . -name "*.txt"
 

 

查找当前目录下(递归子目录)的所有名称以.txt结尾的文件,注意*号的写法,需要前面加\或者放到双引号中

 

 

find . -iname \*.txt
 

 

默认find是区分大小写的,如果不想区分大小写,请使用-iname替代-name,如上则"abc.TXT"将被查找到

 

2) 按类型查找

 

 

find . -type d 
 

 

查找当前目录下(递归子目录)的所有目录

 

 

find . -type f
 

 

查找当前目录下(递归子目录)的所有文件

 

 

find . -type l
 

 

查找当前目录下(递归子目录)的所有符号链接

 

3) 按时间查找

 

1. 以小时为单位的时间

find 命令三个选项用于按照时间查找,单位都是小时:

 

mtime — 文件内容上次修改时间

atime — 文件被读取或访问的时间

ctime — 文件状态变化时间

 

这三个选项都需要配置一个n值使用,可以是-n / n / +n:

-n 小于 n

 n 正好与 n 相等

+n 大于 n

 

 

find . -mtime -1
 

 

查找当前目录下(递归子目录)的所有1小时内修改的文件和目录

 

find . -mtime +1
 

 

查找当前目录下(递归子目录)的所有修改时间超过1小时的文件和目录

 

find . -mtime 1
 

 

查找当前目录下(递归子目录)的所有恰好在1小时前修改的文件和目录

 

2. 以分钟为单位的时间

用法和*time类似,mmin、amin和cmin 的不同在于单位时间是分钟,用于查找在不到1小时的时间内变化了的文件和目录

 

 

find . -mmin -10
 

 

查找当前目录下(递归子目录)的所有10分钟内修改的文件和目录

 

 

find . -mmin +20
 

 

查找当前目录下(递归子目录)的所有20分钟外1小时内修改的文件和目录

 

3. 与特定的文件比较

-newer,-anewer和-cnewer选项用于查找与特定的文件比较的已修改或访问过的文件,类似mtime,atime和ctime

-newer  指内容最近被修改的文件

-anewer 指最近被读取过的文件

-cnewer 指状态最近发生变化的文件

 

 

find . -newer a.txt
 

 

查找当前目录下(递归子目录)的所有修改时间在a.txt之后(所以文件更新)的文件和目录

 

 

4) 按文件大小查找

 

1. -size 选项用于查找满足指定的大小条件的文件(注意不查找目录), +表示大于, -表示小于, 没有+1表示正好等于。文件大小的单位可以是字节(用c表示), kb(用k表示)。

 

 

find . -size -100c
 

 

查找当前目录下(递归子目录)的所有文件大小小于100字节的文件

 

 

find . -size +100k
 

 

查找当前目录下(递归子目录)的所有文件大小大于100k的文件

 

 

find . -size 0
 

 

查找当前目录下(递归子目录)的所有文件大小为0的文件

 

2. -empty 查找空文件和空文件夹, 和-size 0不同的在于-size 0 只查找空文件,或者说-empty -type f 等同于-size 0 :

 

 

find . -empty
 

 

查找当前目录下(递归子目录)的所有文件大小为0的文件和空文件夹

 

 

find . -empty -type f 
 

 

查找当前目录下(递归子目录)的所有文件大小为0的文件

 

 

find . -empty -type d
 

 

查找当前目录下(递归子目录)的所有空目录

 

 

5) 按权限和所有者查找

 

 

find . -perm 777
 

 

查找当前目录下(递归子目录)的所有权限为777的文件和目录

 

 

find . -perm -u=rwx
 

 

查找当前目录下(递归子目录)的所有user权限为rwx的文件和目录

 

 

find . -perm -ug=x
 

 

查找当前目录下(递归子目录)的所有user和group权限为x的文件和目录

 

 

find . -user sky
 

 

查找当前目录下(递归子目录)的所有user为sky的文件和目录

 

find . -group users
 

查找当前目录下(递归子目录)的所有group为users的文件和目录

 

(2) 查找条件的逻辑运算

 

1. 逻辑与

find . -name "*.java" -size -mmin -10
find . -name "*.java" -a -size -mmin -10
 

查找当前目录下(递归子目录)的所有名为*.java并且修改时间在10分钟之内的文件,-a是默认选项

 

2. 逻辑或

find . -name "*.class" -o -name "*.jar"
 

查找当前目录下(递归子目录)的所有名为*.class或者*.jar的文件和目录

 

3. 逻辑非

 

find . ! -user sky
 

查找当前目录下(递归子目录)的所有user不是sky的文件和目录

 

(3) 控制查找的行为

 

find . -maxdepth 3 -name "*.txt"
 

查找当前目录下(递归子目录)的所有名为*.txt的文件,目录深度不超过3层

 

find . -maxdepth 1 -name "*.txt"
 

查找当前目录下(不递归子目录,因为maxdepth为1)的所有名为*.txt的文件

 

find . -mindepth 3 -name "*.txt"
 

查找当前目录下(递归子目录)的所有名为*.txt的文件,目录深度不低于3层

 

find . -mindepth 1 -name "*.txt"
 

查找当前目录下的子目录中(递归子目录)的所有名为*.txt的文件,不包含当前目录

 

find . -depth -name "*.txt"
 

查找当前目录下(递归子目录)的所有名为*.txt的文件,每个目录都是先在目录中进行查找,然后才继续查找其子目录

 

(4) find和其他命令的组合

 

find . -name "*.jar" -exec ls -l {} \;
find . -name "*.jar" -ls
 

查找当前目录下(递归子目录)的所有*.jar文件并使用ls -l列出详细信息

 

find . -name "*.java" -exec grep -H -m 1 HashMap {} \;
 

查找当前目录下(递归子目录)的所有的含有"HashMap"字样的*.java文件

(grep -H -m 1的意思是打印文件名,而且如果文件中有一次匹配就退出,避免多次匹配时为这一个文件打印多行)

 

find . -name "*.sh" -exec mv {} backup \;
 

查找当前目录下(递归子目录)的所有的*.sh文件并移动到backup目录中

 

相关标签: Linux F#