本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/144
一、简介
Linux里的find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
二、格式说明
代码语言:javascript复制find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
find pathname -options [-print -exec -ok ...]
find pathname -options [-print -exec -ok command ] {} ;
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
default path is the current directory; default expression is -print
expression may consist of: operators, options, tests, and actions:
operators (decreasing precedence; -and is implicit where no others are given):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
positional options (always true): -daystart -follow -regextype
normal options (always true, specified before other expressions):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xautofs -xdev -ignore_readdir_race -noignore_readdir_race
tests (N can be N or -N or N): -amin N -anewer FILE -atime N -cmin N
-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
-nouser -nogroup -path PATTERN -perm [-/]MODE -regex PATTERN
-readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]
-context CONTEXT
actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} -okdir COMMAND ;
说明:
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } ;,注意{ }和;之间的空格。-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠,如find ./ -type f -perm 644 -exec ls -l {} ;
。{} 花括号代表前面find查找出来的文件名。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
三、选项说明
通过find --help
或者man find
进行详细查看
find 根据下列规则判断 path 和 expression,在命令列上第一个 -() , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。expression 中可使用的选项有很多,在此只介绍最常用的。
-name: 按照文件名查找文件。
-perm: 按照文件权限来查找文件。
-prune: 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user: 按照文件属主来查找文件。
-group: 按照文件所属的组来查找文件。
-amin n: 在过去n分钟内被读取过, 查找系统中最后n分钟访问的文件
-cmin n: 在过去n分钟内被修改过, 查找系统中最后n分钟被改变文件状态的文件
-mmin n: 在过去n分钟内被修改过内容,查找系统中最后n分钟被改变文件数据的文件
-anewer file:比文件 file 更晚被读取过的文件
-cnewer file:比文件 file 更新的文件
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-atime n: 在过去n天内被读取过的文件,查找系统中最后n*24小时访问的文件
-ctime n: 在过去n天内被修改过的文件, 查找系统中最后n*24小时被改变文件状态的文件
-mtime n: 在过去n天内被修改过文件内容的文件,查找系统中最后n*24小时被改变文件数据的文件
-empty: 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p: 路径名称符合 p 的文件,ipath 会忽略大小写
-mtime -n n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内, n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
-nogroup: 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser: 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。默认单位是b,而它代表的是512字节,所以2表示1K,1M则是2048,如果不想自己转换,可以使用其他单位,如c、K、M等。
-size n[cwbkMG]
File uses n units of space. The following suffixes can be used:
`b' for 512-byte blocks (this is the default if no suffix is used)
`c' for bytes
`w' for two-byte words
`k' for Kilobytes (units of 1024 bytes)
`M' for Megabytes (units of 1048576 bytes)
`G' for Gigabytes (units of 1073741824 bytes)
The size does not count indirect blocks, but it does count blocks in sparse files that are not actually
allocated. Bear in mind that the `%k' and `%b' format specifiers of -printf handle sparse files differ‐
ently. The `b' suffix always denotes 512-byte blocks and never 1 Kilobyte blocks, which is different to
the behaviour of -ls.
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点,只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
扩展:
在linux操作系统中,每个文件都有很多的时间参数,其中有三个比较主要,分别是ctime,atime,mtime
- 修改时间,modification time(mtime):
当修改文件的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别
- 状态修改时间,change time(ctime)
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,而是change time,但这么说也不完全对,因为只有当更新文件的属性或者权限的时候才会更新这个时间,更改内容的话是不会更新这个时间的
- 访问时间,access time(atime)
当使用这个文件的时候就会更新这个时间
我们可以通过stat
命令来查看,比如 stat test.txt
:
File: ‘test.txt’
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 396912 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-09-22 14:59:33.504678788 0800
Modify: 2021-09-22 14:59:33.504678788 0800
Change: 2021-09-22 15:10:04.690899763 0800
Birth: -
四、命令功能
用于在系统目录中查找文件,并作出相应的处理
五、常见用法
1.根据类型查找,将当前目录及其子目录中的所有文件列出
代码语言:javascript复制find ./ -type f
2.根据关键字来查找,将当前目录及其子目录下所有文件后缀为".log" 的文件列出
代码语言:javascript复制find ./ -name "*.log"
3.根据时间来查找,将当前目录及其子目录下所有最近 10 天内更新过的文件列出
代码语言:javascript复制find ./ -ctime -10
4.查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们
代码语言:javascript复制find /var/log -type f -mtime 7 -ok rm {} ;
5.根据文件权限来查找,查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件
代码语言:javascript复制find ./ -type f -perm 644 -exec ls -l {} ;
6.根据文件大小来查找,查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径
代码语言:javascript复制find / -type f -size 0 -exec ls -l {} ;
7.根据文件权限为查找,查找当前目录及其子目录中所有权限为777的目录或者文件
代码语言:javascript复制find ./ -perm 777
8.根据类型查找,查找当前目录及其子目录下的目录
代码语言:javascript复制find ./ -type d
9.查找当前所有目录并排序
代码语言:javascript复制find ./ -type d | sort
10.根据大小查找文件,查找当前目录及其子目录中所有大于1k的文件或者木目录
代码语言:javascript复制find ./ -size 1k
11.根据大小查找文件,查找当前目录下文件大小为2048(2k)字节的文件
代码语言:javascript复制find ./ -size 4find ./ -size 2048cfind ./ -size 2K
12.查找大于1K的文件, 表示大于
代码语言:javascript复制find ./ -size 1024c
13.查找小于1K的文件,- 表示小于
代码语言:javascript复制find ./ -size -1024c
14.根据大小查找范围,查找大小在某个范围内的文件使用-size参数,-size n表示大于n单位的范围,-size –n表示小于n单位的范围。例如,查找/var/log目录下大于100k且小于400k的文件并列出它们的完整路径:
代码语言:javascript复制find /var/log -type f -size 100k -size -400k | xargs ls –lfind /var/log -type f -size 100k -size -400k -exec ls -l {} ;
15.根据文件查找并执行命令,将command命令放在find命令的-exec选项中执行
代码语言:javascript复制find ./ -type f -exec ls -l {} ;
16.根据时间查找并删除,在目录中查找更改时间在14日以前的文件并删除它们
代码语言:javascript复制find ./ -type f -mtime 14 -exec rm {} ;
17.在目录中查找后缀为**.log**的文件且更改时间在14日以前的文件并删除它们,在删除之前先给出提示
代码语言:javascript复制find ./ -name "*.log" -mtime 14 -ok rm {} ;
18.查找文件并筛选文件,并且查看文件里是否含有需要查找的内容,在-exec中使用grep命令进行筛选
代码语言:javascript复制find /etc -name "passwd*" -exec grep "root" {} ;find /etc -name "passwd*"|xargs grep root
任何形式的命令都可以在-exec选项中使用。 在上面的例子中我们使用grep命令。find命令首先匹配所有文件名为"passwd*"的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。
19.查找文件并移动到指定目录,将当前目录及其子目录中所有后缀为".log"的文件移动到/tmp目录下面
代码语言:javascript复制find ./ -name "*.log" -exec mv {} /tmp ;
20.查找文件并移动到指定目录,将当前目录及其子目录中所有后缀为".log"的文件复制到/tmp目录下面
代码语言:javascript复制find ./ -name "*.log" -exec cp {} /tmp ;
六、扩展
在使用 find
命令的-exec
选项处理匹配到的文件时,find
命令将所有匹配到的文件一起传递给-exec
执行。但有些系统对能够传递给-exec
的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs
命令的用处所在,特别是与find
命令一起使用。
find命令把匹配到的文件传递给xargs
命令,而xargs
命令每次只获取一部分文件而不是全部,不像-exec
选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec
选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs
命令则只有一个进程。另外,在使用xargs
命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
1.查找当前目录下的文件,然后使用xargs命令来测试它们分别属于哪类文件
代码语言:javascript复制find ./ -type f -print | xargs filefind ./ -type f | xargs file
2.在整个系统中查找后缀为**.log**文件,然后把结果保存到temp.text 文件中
代码语言:javascript复制find ./ -name "*.log" -print | xargs echo "" > temp.text
3.在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限
代码语言:javascript复制find ./ -perm -777 -print | xargs chmod o-w
4.在当前目录下,用grep命令在所有的文件中搜索hostname这个词
代码语言:javascript复制find ./ -type f -print | xargs grep "hostname"
5.查找文件并移动到指定目录,将当前目录及其子目录中所有后缀为".log"的文件移动到/tmp目录下面
代码语言:javascript复制find ./ -name "*.log" | xargs -i mv {} /tmp
6.find后执行xargs提示xargs: argument line too long
代码语言:javascript复制find ./ -type f -atime 0 -print0 | xargs -0 -l1 -t rm -f
说明:
-l1是一次处理一个;-t是处理之前打印出命令
7.查找文件并移动到指定目录,将当前目录及其子目录中所有后缀为".log"的文件移动到/tmp目录下面并询问,xargs的-p参数的使用
代码语言:javascript复制find ./ -name "*.log" | xargs -p -i mv {} /tmp
-p参数会提示让你确认是否执行后面的命令,y执行,n不执行。
不足之处,请指正
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/144