0
点赞
收藏
分享

微信扫一扫

Linux命令--find--使用/教程/示例


简介

说明

        本文介绍Linux的grep命令的用法。

find命令简介

        find命令用于搜索文件中的内容(字符串)。

        find支持 ​​glob匹配模式​​。不支持正则表达式

which, whereis, locate, find的区别


命令



查找范围



查找的文件类型



速度



备注



which



$PATH路径



可执行文件





默认只返回第一个匹配的​​文件路径​​。通过选项 -a 可以返回所有结果。



whereis



$PATH

其他几个特定系统目录



二进制(命令)、源文件、man文件








locate



文件的索引数据库



所有





新建的文件需要时间才能加入该索引数据库。可通过updatedb命令强制更新索引,确保不会遗漏文件。该命令通常会返回大量匹配项,可使用 -r 选项通过正则表达式来精确匹配。



find



所有文件



所有







示例

基本用法


命令



作用



find -name "*fb*"



查找当前目录文件名有fb的文件(默认递归)



find /tmp /usr -name \*.log



多个目录去找



find ./ -iname \*.txt



大小写都匹配


根据类型查找


命令



作用



find ./ -type d



当前目录下的所有子目录



find ./ -type d -name “sys”



在当前目录下搜索有文件名带有sys的路径



find /usr -type l



/usr下所有的符号链接



find /usr -type l -name "z*" -ls



符号链接的详细信息 eg:inode,目录


按文件条件查找


命令



作用



find /home/admin -size +250000k



超过250000k的文件,当然+改成-就是小于了



find /home/admin f -perm 777 -exec ls -l {} \;



按照权限查询文件



find /home/admin -atime -1



1天内访问过的文件     



find /home/admin -ctime -1



1天内状态改变过的文件  



find /home/admin -mtime -1



1天内修改过的文件     



find /home/admin -amin -1



1分钟内访问过的文件     



find /home/admin -cmin -1



1分钟内状态改变过的文件 



find /home/admin -mmin -1



1分钟内修改过的文件     


格式

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

path:  find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。

-option:选项。见下边

-print: find命令将匹配的文件输出到标准输出。

-exec: find命令对匹配的文件执行该参数所给出的shell命令。

      相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。

-ok:  和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

选项


选项



含义



-mount, -xdev



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



-[a/m/c]min [-]n



在n分钟前/内 被a/m/c过的文件。可以用+-表示大于此时间或小于此时间。

a:access        //访问(读取)

m:modification  //修改(文件内容被修改)

c:change       //变更(内容被修改,或权限等 metadata 被修改)

例:

-mmin 2 两分钟前被修改过  等价于 -mmin +2

-mmin -2 两分钟内被修改过



-[a/m/c]newer file



比文件 file 更晚被 读取/修改/变更 过的文件。



-[a/m/c]time [-]n



在n天前/内 被 读取/修改/变更 过的文件。



-empty



空的文件



-gid n或

-group name



gid 是 n 或是 group 名称是 name



-ipath pattern,

-path pattern



路径名称符合pattern的文件,ipath 会忽略大小写。

支持通配符。



-name pattern,

-iname pattern



文件名称符合 pattern的文件。iname 会忽略大小写。

支持正则表达式。



-size [+-]n[b/c/k/M/G]



文件大小是n单位。b代表 512 位元组的区块,c表示字节数,k表示 kB,M表示MB,G表示GB,w是两个字节。

可以用+-表示比这个大小大或者小。

例如:find / -size +1G 检索文件大小高于 1 GB 的文件



-type



b 块设备文件

c 字符设备文件

d 目录文件   //-d可能会被废弃。 改用-depth

p 命名管道(FIFO)

f 普通文件

l 符号链接文件(symbolic links)

s socket文件



-depth



在进入子目录前先行查找完本目录。



-perm



以文件权限为依据进行搜索。

例1:检索 /usr 目录下权限为 rwxr-xr-x 的文件:

find /usr -perm u=rwx,g=rx,o=rx

例2:只要求文件有执行权限,不管其读写权限是什么。

find / -type f -perm /a=x

其中 a=x 前面的 / 符号即用来表示只匹配权限的某个子集(执行权限),而不用关心其他权限的具体设置。

备注:-perm 选项也支持数字形式的文件权限标记。

find /usr -perm 644 搜索 /usr 目录下权限为 644(即 rwxr-xr-x)的文件



-prune



忽略某个目录

如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。

例1:在/usr/sam目录下查找不在dir1子目录之内的所有文件

find /usr/sam -path "/usr/sam/dir1" -prune -o -print

-path "/usr/sam" -prune -o -print 等价于 -path "/usr/sam" -a -prune -o -print。

例2:避开多个文件夹

find /usr/sam ( -path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -print

圆括号表示表达式的结合:表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。

例3:在/usr/sam路径下,但排除/usr/sam/dir1和/usr/sam/dir2,查找tmp文件

find /usr/sam (-path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -name "tmp" -print

注意:-name等选项加在-o 之后



-maxdepth



限制 find 命令递归的层数。

find / -maxdepth 3 搜索时向下递归的层数最大为 3



-delete



删除搜索到的文件和目录。

例:删除 home 目录下所有的空目录:

find ~ -type d -empty -delete



-user,

-nouser



按文件属主查找文件

例1:在/etc目录下查找文件属主为uucp的文件:

$ find /etc -user uucp -print

例2:在/home目录下查找属主在/etc/passwd文件中没有有效帐户的文件

$ find /home -nouser -print

备注:查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。



-group,

-nogroup



和-user类似



-fstype type



指定文件所在的文件系统的类型



-ls



显示文件信息

如果想浏览搜索到的文件(目录)的详细信息(如权限和大小等),可以直接使用 -ls 选项。

例:find / -type file -size +1G -ls 浏览所有 1G 以上大小的文件的详细信息



-exec



解析



对搜索到的结果执行特定的命令。

例1:将 home 目录下所有的 MP3 音频文件复制到移动存储设备(假设路径是 /media/MyDrive),可使用下面的命令:

find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'


其中的大括号({})作为检索到的文件的占位符 ,而分号( ;)作为命令结束的标志。因为分号是 Shell 中有特殊含义的符号,所以需要使用单引号括起来。

每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {},然后执行 -exec 后面的命令一次。

例2:在用户主目录下的所有文件中检索字符串 hello ,可以使用如下命令:

find ~ -type f -exec grep -l hello {} ';'



+



执行完find命令之后,再执行-exec。

例:将用户主目录下所有的 MP3 文件添加到压缩包 music.tar.gz 中,直观的感觉是,其命令应为如下形式:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'


实际情况是,这样得到的 music.tar.gz 其实只包含一个 MP3 文件。

原因是 find 命令每次发现一个音频文件,都会再执行一次 -exec 选项后面的压缩命令。导致先前生成的压缩包被覆盖。


可以先让 find 命令检索出所有符合条件的音频文件,再将得到的文件列表传递给后面的压缩命令。完整的命令如下:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +



其他操作



!



对当前的匹配条件进行“反义”(类似于逻辑非操作)。

例1:检索 /usr 下所有文件名不以 .txt 为后缀的文件

find /usr -type f ! -name '*.txt'

例2:检索/usr下所有不为空的文件

find /usr -type f ! -empty



-[a/o]



表示与(and)和或(or)。

例1: /usr 下文件名以 python 开头且类型为目录的文件

find /usr -type d -name 'python*'

等同于:find /usr -type d -a -name 'python*'

例2:find / '(' -mmin -5 -o -mtime +50 ')' -a -type f

备注:可以使用小括号对搜索条件进行分组。注意 find 命令中的小括号常需要用单引号包裹起来。因小括号在 Shell 中有特殊的含义。


-exec

对搜索到的结果执行特定的命令。

例1:将 home 目录下所有的 MP3 音频文件复制到移动存储设备

(假设路径是 /media/MyDrive),可使用下面的命令:

find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'

其中的大括号({})作为检索到的文件的占位符 ,而分号( ;)作为命令结束的标志。因为分号是 Shell 中有特殊含义的符号,所以需要使用单引号括起来。

每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {},然后执行 -exec 后面的命令一次。

例2:在用户主目录下的所有文件中检索字符串 hello

可以使用如下命令:

find ~ -type f -exec grep -l hello {} ';'

+

执行完find命令之后,再执行-exec。

        例:将用户主目录下所有的 MP3 文件添加到压缩包 music.tar.gz 中,直观的感觉是,其命令应为如下形式:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'

实际情况是,这样得到的 music.tar.gz 其实只包含一个 MP3 文件。

        原因是 find 命令每次发现一个音频文件,都会再执行一次 -exec 选项后面的压缩命令。导致先前生成的压缩包被覆盖。

        可以先让 find 命令检索出所有符合条件的音频文件,再将得到的文件列表传递给后面的压缩命令。完整的命令如下:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} 


举报

相关推荐

0 条评论