codecamp

Linux find 命令

Linux find 命令

Linux 命令大全 Linux 命令大全

Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} ;

参数说明 :

find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

-amin n : 在过去 n 分钟内被读取过

-anewer file : 比文件 file 更晚被读取过的文件

-atime n : 在过去 n 天过读取过的文件

-cmin n : 在过去 n 分钟内被修改过

-cnewer file :比文件 file 更新的文件

-ctime n : 在过去 n 天过修改过的文件

-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c : 文件类型是 c 的文件。

d: 目录

c: 字型装置文件

b: 区块装置文件

p: 具名贮列

f: 一般文件

l: 符号连结

s: socket

-pid n : process id 是 n 的文件

你可以使用 ( ) 将运算式分隔,并使用下列运算。

exp1 -and exp2

! expr

-not expr

exp1 -or exp2

exp1, exp2

实例

列出给定目录(base_path)下所有的文件和子目录:

find base_path -print

补充:根据文件名和正则表达式进行搜索,使用选项 -name 或 -iname (忽略大小写):

find base_path -name ‘xxx’ -print

find base_path -iname ’xxx‘ -print


否定参数,可以用 !排除所指定到的模式


此处将打印出除 txt 文本文件外的的所有文件。

基于目录深度的搜索

find 命令指定遍历完所有的子目录。使用 -maxdepth 和-mindefth 可以限制 find 命令遍历的目录深度,并且 find 命令默认不搜索符号链接,可以用 -L 选项改变这种行为。


例如-maxdepth的参数为1时,只匹配当前目录下。


-mindepth 的参数代表了开始进行匹配的目录到 base_path 的最短距离。

基于文件类型搜索

使用 -type 可以指定搜索的文件类型,linux/unix 将所有的的一切都视为文件(文件类型有:普通文件 f,目录 d,符号链接 l,字符设备 c,块设备 b,套接字 s,FIFO-p),使用 -type 选项我们能够对文件类型进行过滤。


此处就会只匹配出特定项下的所有普通文件,和目录。

根据文件的时间戳进行搜索

Linux/Unix 文件系统中的每一个文件都有三种时间戳,访问时间(-atime),修改时间(-mtime),变化时间(-ctime),单位为天数,用整数指定,数字前加上+,表示大于这个时间;加上-,表示小于这个天数;不加表示刚好这个天数。


此处的文件是我在进行截图之前才创建的,访问,修改,变化时间均小于一天。

当然相应的用分钟作为单位就可以用选项 (-amin)(-mmin)(-cmin),如下我们测试修改时间


基于文件大小的搜索

find 提供了指定文件大小的单位选项进而搜索符合大小文件的功能,这个搜索也常常会让用户感到非常舒服(b:块, c:字节, w:字, k:千字节, M:兆字节, G:吉字节)。

在搜索之前我们先用 ls(list)指令来查看下当前目录下的文件信息:


信息的第五列就是各文件目录的大小(字节),我们通过指定匹配条件来搜索:


经过测试,在开始目录下,文件类型为普通目录,文件大小大于30个字节的文件就是zl.txt了

基于文件权限和所有权的匹配

-perm 选项指定了 find 指匹配指定权限的文件,参数为文件对应的权限码。

我们仍然可参考⑥中的所有文件信息的第一列,此处需要掌握一定关于文件权限的知识。如下我们查找权限为 644 的普通文件,即用户可读写,组用户可读,其他可读。


也可以用选项 -user,匹配指定用户所拥有的文件,参数为用户名或者UID

利用find执行相应操作

比如删除文件,使用 -delete 选项;删除测试目录下所有的 .txt 普通文件


还可以利用 -exec 选项结合其他命令对文件进行更高效的操作,更改文件的所属权,复制文件等,find 命令使用一对花括号 {} 代表文件名,对于每一个匹配到的文件,find 命令会将{}替换成相应的文件名; 如果 -exec 的命令有多个参数时,需要注意结尾使用 " \; " 或者 "+",前者表示进行转义,不然系统会以为是 find 命令的结尾。

我们将测试目录下的所有的 .txt 文件由用户 lihongbo 转换到用户 litao999,我们必须以 root 用户进行此操作,chown 用于更改权限:


指定 find 跳过特定的目录

使用 -prune 选项可以跳过我们在搜寻的的一些明显我们不需要的目录


跳过了 ./test1 目录

需要指出的是:选项出现的先后次序我们也应该考虑到内,因为它会影响到整条命令的执行效率。

Linux 命令大全 Linux 命令大全


温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }