在find中使用通配符时,要用双引号,如
"name *"
选项 | 作用 |
---|---|
-name filename | 查找名为filename的文件 |
-iname filename | 同上,忽略文件名大小写 |
-perm | 按执行权限来查找 |
-user username | 按文件属主来查找 |
-group groupname | 按组来查找 |
-mtime -n +n | 按文件更改时间来查找文件,-n指n天以内,+n指n天以前 |
-atime -n +n | 按文件访问时间来查 |
-ctime -n +n | 按文件创建时间来查找文件,-n指n天以内,+n指n天以前 |
-nogroup | 查无有效属组的文件,即文件的属组在/etc/groups中不存在 |
-nouser | 查无有效属主的文件,即文件的属主在/etc/passwd中不存 |
-type b/d/c/p/l/f | 查是块设备、目录、字符设备、管道、符号链接、普通文件 |
-depth | 先查找子目录,再查找父目录 |
-maxdepth n | 规定查找的最大目录深度,当前目录的深度就是1 |
-path | 后面跟路径,指定文件或文件夹的路径 比如 "./dir/*" 表示当前目录下的dir目录下的所有文件但是 "./dir" 仅仅表示dir这一个目录,也就是说这个选项只会影响这一个目录,而不影响目录下的文件 |
find条件判断
- -o 相当于bash的||,即前面为假则继续
- -a 相当于bash的&&,前面为真,则继续
- ! 对选项的判断结果取反(选项的结果不是判断而是操作,那这个!就是无效的,比如 -print 和 ! -print效果一样)
-o 和 -a必须加在两个选项之间,意思是前一个选项为假/真,就执行下一个选项,! 直接加到选项前面即可,但是也要有空格
多个选项之间默认的逻辑是 -a
,也就是【与】
例子
find . -name "grub*" -print
:遍历当前目录下所有文件(夹),如果文件(夹)的名字是以grub开头的,就打印文件(夹)的名字
find后面的一个点【英文的句号】表示当前目录,可以省略。find . -name "grub*" -o -print
:遍历当前目录下所有文件(夹),如果文件(夹)的名字不是以grub开头的,就打印文件(夹)的名字find -path "./dir/*" -o -print
:列出除了dir目录下的所有文件find ! -path "./dir/*" -print
:效果同上find ! -path "./dir1/*" ! -path "./dir2/*" -print
:排除多条路径
条件判断太复杂了,我现在只能说把【!】用在排除路径上挺好的,还是不要用在其他地方上,而且也不要用【-o】,【-a】
正则表达式
-regex 'regex'
:用正则表达式来匹配
-name 不能搜索所有深度的子目录,有一些目录会被略过,略过的规则不清楚,但可以肯定的是它不是安装目录深度来判断是否需要略过的
需要查找所有深度的文件需要使用正则表达式
正则表达式匹配的是文件的相对路径,而不是文件名
正则表达式可以用单引号,也可以使用双引号,如果使用双引号那就可以在里面直接使用 bash 变量了
-iregex 是忽略大小写的正则表达式
find -type f -regex '.*\.mk$'
:查找当前目录及所有深度的子目录中的 mk 文件
xargs -d:设置分隔符,默认空格和换行都是分隔符
find PATH option -print0 | xargs -0 command
find 的输出一行表示一个查找到的文件,而 xargs 以空格作为分隔符,所以如果 find 的某一行输出中包含空格(也就是说某个文件名中包含空格),那对于 xargs 来说这一行表示两个文件
为了解决这个问题,使用 -print0,使得 find ,每输出一个文件之后都跟一个 NULL 字符,再使用 -0 告诉 xargs 使用 NULL 字符作为分隔符,而不是空格
xargs 比较常用的参数还有 -I
,这个参数是指定一个字符作为特殊字符,后面命令中用到的该特殊字符会被替换成 xargs 的输出,这个特殊字符常常使用{}
这里我查找所有【此间少年】目录下的文件(此间少年是高晓松的作品集,由众多歌手演唱,所以会看到【老狼】这个目录下有【此间少年】的目录,【叶蓓】的目录下也有),把它们复制到根目录的【此间少年】目录中
find -type f -regex '.*此间的少年.*' -print0 | xargs -0 -I mv {} 此间的少年/
删除所有空目录,rmdir 不会删除非空目录,-depth 会先列出子目录,这样子目录如果被删除,父目录也变空的了,那也会删除
find -type d -depth -print0 | xargs -0 rmdir