find指令的使用

find的使用总结

find path路径 option选项  [-delete] [-print] [-exec | -ok  shell命令] {} \;   需要注意的是 {} 和\; 2者分别为一个整体,2者中间使用空格分离

-exec是执行的意思,{}是find的搜寻结果,\;是转义分号,不让shell去解释,因为这个分号是给-exec用的.

find ./ -type f -name "*.log" -delete

1)path路径 比较好理解,可以使用相对路径,绝对路径,以及特殊路径比如 ~  /  .    等等

如果使用时,不指定路径,那么将使用当前路径

2)option选项

2.1)这部分是关键,find核心部分

====================================================
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件

-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录

需要注意cpio、 depth与prune 、-perm参数的使用
=====================================================

2.2)举例

find / -name filename |xargs rm -rf
之所以find . -name filename |rm -rf不通过,是因为rm命令不接受从标准输入传过来的指令


find示例
备份配置文件,添加.orig这个扩展名
find -name “*.conf” -exec cp {} {}.orig \;
提示删除存在时间超过3天以上的joe的临时文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在主目录中寻找可被其它用户写入的文件
find ~ -perm -002 -exec chmod o-w {} \;
查找/data下的权限为644,后缀为sh的普通文件,增加执行权限
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
查看/home的目录
find /home -type d -ls  这里可以跟-ls 命令列出

注意这里的option 默认是-a 即 逻辑and 的关系,但可以添加-o 来设定option选项之间为 逻辑或 的关系

find / -type f -size +20k -size -100k
size默认在20k到100k之间

find / -type f -size -20k -o -size +100k
注意这里的-o不可或缺,否者查找条件或存在逻辑缺陷

find / -type f \( -name ".sh" -o -name ".txt" \)
find / -type f -name ".sh" -o -name ".txt"
以上2者输出不一样,如下:

find查找多目录
待填坑

find  depth  maxdepth mindepth选项

find   /home    -name tmp.txt    -maxdepth   4   列出/home内的tmp.txt 查时深度最多为3层
find   /home   -name tmp.txt   -mindepth   3   从第2层开始查

在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。 

结合xargs来使用

xargs后面默认隐藏了echo,后面不加命令的话会把前面传递进来的值显示一遍。但是它会把前面输入的值里面的回车默认给换成空格
因为 useradd 不支持一次创建多个用户,并且也不支持用户名之间有空格,所以直接传递会报错,必须用xargs -n 1命令让它每行只显示一个参数,然后就换行。
这样配合这个命令便可创建多用户了。
例子:
[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# seq 5
1
2
3
4
5

[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# seq 5|xargs
1 2 3 4 5

echo newuser{1..5} |xargs -n 1 useradd

xargs它本身也是有一个默认换行的长度。因为用touch或者rm命令等,他们本身支持多个参数,所以可以不指定xargs后每一行有多少个参数,但useradd这种一次只能一个的,必须定义一行一个。
用echo {1..100000} |xargs |wc -l 可知分成5行
用echo {1..100000} |xargs >f1.t ,查看f1 ,得知一行有23695个参数,这也是默认换行的每一行最多的参数,touch 等可以支持这么多的参数。

find查询结果 拷贝到目录
find . -iname "*.doc" -type f -exec cp {} /tmp/doc \;
find ./ -name "*.c" -exec cp '{}' ./dog/ \;
find ./ -name "*.c" | xargs -i cp {} ./dog/

find删除
find / -name filename |xargs rm -rf
find / -name filename |xargs rm -rf {}
以上2者加上或者不加上{}的效果一致

find结合tar打包,有以下几种方法:
①、将按照自己条件搜索出来的文件名写入到一个文件 tmp.list 中
find /tmp -cmin +24 > tmp.list
然后将文件中记录到的所有文件加入到压缩包中
tar -T tmp.list -czvf tmp.expire.tar.gz
②、
find . -name "*.txt*" -name "*test*" -type f | xargs tar -cvf test.tar.gz //找到当前目录文件名包含".txt"和"test"的文件,并打包成test.tar.gz

find查找目录下 如何排除底下的子目录查找
查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path '/etc/sane.d' -a –prune -o -name “.conf”
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的所有.conf后缀的文件
find /etc \( -path "/etc/sane.d" -o -path "/etc/fonts" \) -a -prune -o -
name ".conf"
解释如下:如果用-path选项,那么其后面的文件夹名称是针对find后面写的路径的相对路径来找的,只有前面也是绝对路径,-path后面再用绝对路径才有效

3)-print,只用来将 标准输出 显示出来,如下:

 实际上find 指令不加上-print以及后续的-exec或-ok时,默认会加上-print

4)-exec 参数 或者-ok 参数

2者区别在于 -exec 不询问用户,-ok会询问

参考:https://www.bbsmax.com/A/1O5E3648z7/   Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法

原文地址:https://www.cnblogs.com/weihua2020/p/13720133.html