find命令
命令描述:
按层次查找目录中的文件
语法:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
一般形式:find pathname -options [-print -exec -ok ...]
参数:
pathname: find命令所查找的目录路径。用.来表示当前目录,用/来表示系统根目录,..表示父目录。查到的结果会以pathname指定的路径为起始目录
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格
选项
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
应用举例
1、按文件名查找符合条件的文件
-name 按照文件名查找文件。
[root@localhost ~]# find /etc -name "*ass*" /etc/libnl/classid /etc/pam.d/passwd
2、按文件属性查找文件
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
逻辑运算符:
-a -o -not 与、或、非
准备环境 [root@localhost ~]# mkdir -p /app/{a..c} [root@localhost ~]# touch /app/{a..c}/{a..c} [root@localhost ~]# chgrp test1 /app/{a..b}/b [root@localhost ~]# chown test.test /app/{a..c}/a [root@localhost ~]# chown test.test1 /app/{a..c}/c [root@localhost ~]# ll /app/* /app/a: total 0 -rw-r--r--. 1 test test 0 May 23 04:52 a -rw-r--r--. 1 root test1 0 May 23 04:52 b -rw-r--r--. 1 test test1 0 May 23 04:52 c /app/b: total 0 -rw-r--r--. 1 test test 0 May 23 04:52 a -rw-r--r--. 1 root test1 0 May 23 04:52 b -rw-r--r--. 1 test test1 0 May 23 04:52 c /app/c: total 0 -rw-r--r--. 1 test test 0 May 23 04:52 a -rw-r--r--. 1 root root 0 May 23 04:52 b -rw-r--r--. 1 test test1 0 May 23 04:52 c
按属主或者ID号查找 [root@localhost ~]# find /app/ -user test ## 或者find /app/ -user 1000 /app/a/a /app/a/c /app/b/a /app/b/c /app/c/a /app/c/c 按属组或id号查找 [root@localhost ~]# find /app/ -group root # 或者find /app/ -group 0 /app/ /app/a /app/b /app/c /app/c/b 按逻辑运算符查找 [root@localhost ~]# find /app/ -group test1 -a -user test /app/a/c /app/b/c /app/c/c [root@localhost ~]# find /app/ -group test1 -o -user test /app/a/a /app/a/b /app/a/c /app/b/a /app/b/b /app/b/c /app/c/a /app/c/c [root@localhost ~]# find /app/ -group test1 -not -user test /app/a/b /app/b/b
3、按目录的深度
-mindepth 查找目录的最小深度。
-maxdepth 查找目录的最大深度
查找最大层次 [root@localhost ~]# find / -maxdepth 2 -name "*ass*" /sys/class /etc/passwd- /etc/passwd 查找最小层次 [root@localhost ~]# find / -mindepth 2 -name "*asswd" /sys/fs/selinux/class/passwd /sys/fs/selinux/class/passwd/perms/passwd /etc/pam.d/passwd /etc/passwd /etc/security/opasswd /usr/bin/gpasswd /usr/bin/passwd 介于某一层次区间的 [root@localhost ~]# find / -mindepth 1 -maxdepth 3 -name "*asswd" /etc/pam.d/passwd /etc/passwd /etc/security/opasswd /usr/bin/gpasswd /usr/bin/passwd /usr/sbin/chpasswd /usr/sbin/lpasswd
4、按文件大小查找
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
准备环境 [root@localhost ~]# dd if=/dev/zero of=test1 bs=1024 count=10 10+0 records in 10+0 records out 10240 bytes (10 kB) copied, 0.0004966 s, 20.6 MB/s [root@localhost ~]# dd if=/dev/zero of=test2 bs=1 count=20480 20480+0 records in 20480+0 records out 20480 bytes (20 kB) copied, 0.0510684 s, 401 kB/s [root@localhost ~]# dd if=/dev/zero of=test3 bs=10 count=20480 20480+0 records in 20480+0 records out 20480 bytes (20 kB) copied, 0.0512977 s, 399 kB/s 查找小于20k的 [root@localhost ~]# find . -size -20k -name 'test*' ./test1
查找大于20k的
[root@localhost ~]# find . -size +20k -name 'test*'
./test3
查找20k的
[root@localhost ~]# find . -size 20k
./test2
5、按文件类型查找
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
[root@localhost ~]# find /dev -type f [root@localhost ~]# find /dev -type d /dev /dev/net /dev/vfio /dev/snd /dev/snd/by-path /dev/hugepages /dev/mqueue /dev/disk
6、按文件权限查找
-perm 按照文件权限来查找文件。
[root@localhost ~]# find . -type f -perm 600 ./anaconda-ks.cfg ./.bash_history ./.mysql_history ./.viminfo
7、忽略某个目录
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
[root@localhost ~]# find /root -type f -path "/root/a/1" -prune /root/a/1 [root@localhost ~]# find /root -type f -path "/root/a/1" -prune -o -name "1" -print /root/b/1 /root/c/1 /root/1 -path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o -print 的简写表达式按顺序求值,
-a 和 -o 都是短路求值,与 shell 的 && 和 || 类似
如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。
如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。 这个表达式组合特例可以用伪码写为 if -path "/usr/sam" then -prune else -print
8、按修改时间查找
-mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
find命令还有-atime和-ctime 选项
查找修改时间在2天之内的目录 [root@localhost ~]# find /data -type d -mtime -2 /data /data/mysql /data/mysql/data_3306 /data/mysql/data_3306/mysql 查找修改时间在3天之前的 [root@localhost ~]# date -s '+4 day' [root@localhost ~]# find /etc -type f -mtime +3 /etc/resolv.conf /etc/group- /etc/gshadow- /etc/passwd- /etc/group /etc/shadow- /etc/gshadow /etc/passwd /etc/shadow /etc/security/pwquality.conf
9、使用-exec执行shell命令
[root@localhost ~]# find /root -type d -name "2" -exec cp -r {} /tmp \;
10、使用管道符 “|”配合xargs处理
-n: 指定一次处理的参数个数
-d: 自定义参数界定符
-p: 询问是否运行 later command 参数
-t : 表示先打印命令,然后再执行
-i : 逐项处理
[root@localhost ~]# find /etc -type d -name "*as*" |xargs -i cp -r {} /tmp
xargs与exec的区别
1)exec参数是一个一个传递的,传递一个参数执行一次命令;xargs一次将参数传给命令,可以使用-n控制参数个数
xargs将参数一次性传递给tar命令 [root@localhost ~]# find /etc/ -type d -name "ba*" |xargs tar -zcf /root/a.tar.gz tar: Removing leading `/' from member names exec一次传递一个参数 [root@localhost ~]# find /etc/ -type d -name "ba*" -exec tar -zcf /root/b.tar.gz {} \; tar: Removing leading `/' from member names tar: Removing leading `/' from member names tar: Removing leading `/' from member names tar: Removing leading `/' from member names
2)如果指定命令不是只有find最后传递的参数保留(全部保留),最好不要用exec
[root@localhost ~]# tar tf a.tar.gz etc/systemd/system/basic.target.wants/ etc/systemd/system/basic.target.wants/rhel-dmesg.service etc/systemd/system/basic.target.wants/microcode.service etc/bash_completion.d/ etc/bash_completion.d/iprutils etc/bash_completion.d/redefine_filedir etc/selinux/targeted/active/modules/100/bacula/ etc/selinux/targeted/active/modules/100/bacula/cil etc/selinux/targeted/active/modules/100/bacula/hll etc/selinux/targeted/active/modules/100/bacula/lang_ext etc/selinux/targeted/active/modules/100/base/ etc/selinux/targeted/active/modules/100/base/cil etc/selinux/targeted/active/modules/100/base/hll etc/selinux/targeted/active/modules/100/base/lang_ext [root@localhost ~]# tar tf b.tar.gz etc/selinux/targeted/active/modules/100/base/ etc/selinux/targeted/active/modules/100/base/cil etc/selinux/targeted/active/modules/100/base/hll etc/selinux/targeted/active/modules/100/base/lang_ext 应该是exec执行的时候,最后匹配的路径才当做最终参数了,前面的覆盖了 [root@localhost ~]# mkdir a [root@localhost ~]# mkdir b [root@localhost ~]# touch a/a.b [root@localhost ~]# touch a/a.c [root@localhost ~]# find ./ -name "a.*"|xargs tar -zcf /root/c.tar.gz [root@localhost ~]# find ./ -name "a.*" -exec tar -zcf /root/b.tar.gz {} \; [root@localhost ~]# tar tf c.tar.gz ./a/a.b ./a/a.c [root@localhost ~]# tar tf b.tar.gz ./a/a.c
3)exec文件名有空格等特殊字符也能处理;xargs不能处理特殊文件名,如果想处理特殊文件名需要特殊处理
find命令对正则表达式的支持
查找某一路径下以数字命名的文件
[root@iZzm446eh1ux98Z /]# find / -maxdepth 1 -regex '/[0-9]+'
posted on 2020-01-30 01:15 hopeless-dream 阅读(216) 评论(0) 编辑 收藏 举报