1.Find通用格式
find path options express
最常用的就是这句了:
find ./ -name "searString"
如果要不区分大小写就这样写:
find ./ -iname "searString"
2.Find后接Type的文件类型
如果参数是 -type, 后面的类型有以下几种:
b
|
块设备文件
|
c
|
字符设备文件
|
d
|
目录文件
|
f
|
普通文件
|
l
|
链接文件
|
p
|
管道文件
|
s
|
Socket套接字文件
|
3.Find同时指定多个参数
比如:
find ./ -type f -name "*.JPG" -size +1M
一般使用的参数:
-cmin n
|
匹配文件内容或属性在n分钟之前修改过的文件.如果修改时间比n分钟大,用+n,如果在n分钟以内被修改,用-n.
|
-cnewer file
|
匹配文件内容或属性比指定的文件file新的文件.
|
-ctime n
|
匹配文件内容或属性在n天之前修改过的文件.
|
-empty
|
匹配内容为空的文件或路径.
|
-group name
|
匹配文件所属的组为指定name的文件,name可以是组名,也可以是组ID.
|
-iname pattern
|
与-name相同,但不区分大小写
|
-regex pattern
|
用正则表达式匹配文件名.匹配过程包含当前路径符号.比如, 要匹配文件名为
'./fubar3', 则表达式为 '.*bar.' or '.*b.*3', 不能是'f.*r3'.默认的正则表达式规则为Emacs正则表达式, 但可以通过 -regextype 参数修改.
|
-iregex pattern
|
与-regex相同,但不区分大小写.
|
-inum n
|
匹配inode数值为n的文件.
|
-mmin n
|
匹配文件内容在n分钟之前被修改的文件.
|
-mtime n
|
匹配文件内容在n天前被修改的文件.
|
-name pattern
|
匹配文件名与 pattern相同的文件,pattern可以包含通配符.
|
-newer file
|
匹配文件内容比指定文件file新的文件.
|
-nouser
|
匹配没有一个有效用户的文件.对于被删除用户的残留文件和恶意的文件十分有用.
|
-nogroup
|
匹配没有一个有效组用户的文件.
|
-perm mode
|
匹配文件的读写执行权限与mode相同的文件.
|
-samefile name
|
匹配和文件名name拥有相同 inode的文件.
|
-size n
|
匹配文件大小为n(k,M,G)的文件,默认单位为k.
|
-type c
|
匹配文件类型为c的文件.
|
-user name
|
匹配文件所属用户为name的文件,name可以是用户名,也可以是用户ID.
|
-maxdepth levels
|
搜索时目录层次最大为levels. -maxdepth 0表示命令行所在层次,-maxdepth 1表示当前目录下的层次,对于只搜索特定目录层次,比如当前目录下时,此参数很有用.
|
-mindepth levels
|
与-maxdepth 类似,但指定的是最小的目录层次.
|
4.匹配时对参数组合
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
用()可以对参数时行分组,注意()要转义
-and
|
且
|
-or
|
或
|
-not
|
非,此选项也可以贝 ! 来实现
|
( )
|
分组
|
!的用法如下:
find ./ -type f ! -regex ".*html$"
5.对于搜索出来的文件进行操作
find path option expression -exec command {} \;
比如:
find ./ -type f -name 'foo*' -exec rm -f {} \;
注意分号是命令的一部分,不是命令结尾标志.
6.解决文件名中带空格的问题
Find命令与Xargs同时使用时,如果文件名中带有空格会有异常,比如:
-
$ find ./ -type f -print | xargs ls -l
-
ls: cannot access ./this: No such file or directory
-
ls: cannot access is: No such file or directory
-
-rwxr-xr-x 1 root root 393 May 23 10:38 ./readfile2.py
-
-rwxr-xr-x 1 root root 345 May 23 10:57 ./readfile3.py
-
-rwxrwxr-x 1 lhn lhn 508 May 23 09:40 ./readfile.py
-
-rwxrw-r-- 1 lhn lhn 500 May 27 19:25 ./scanDir.py
-
-rwxrwxr-x 1 lhn lhn 985 May 26 13:19 ./sql.py
-
-rwxrw-r-- 1 lhn lhn 205 May 27 19:31 ./str.py
对于这种情况可以使用 -print0参数,它可以在文件名后面加上null字符,解析时也用相应的方式
-
$ find ./ -type f -print0 | xargs --null ls -l
-
-rwxr-xr-x 1 root root 393 May 23 10:38 ./readfile2.py
-
-rwxr-xr-x 1 root root 345 May 23 10:57 ./readfile3.py
-
-rwxrwxr-x 1 lhn lhn 508 May 23 09:40 ./readfile.py
-
-rwxrw-r-- 1 lhn lhn 500 May 27 19:25 ./scanDir.py
-
-rwxrwxr-x 1 lhn lhn 985 May 26 13:19 ./sql.py
-
-rwxrw-r-- 1 lhn lhn 205 May 27 19:31 ./str.py
-
-rw-rw-r-- 1 lhn lhn 0 May 28 07:54 ./this is
对于 for file in $(find ./ -iname "*"); do file "$file"; done 这种通常使用的循环中如果文件名里面有空格字符,
比如:
-
$ for file in $(find ./ -iname "*"); do file "$file"; done
-
./: directory
-
./sql.py: a python script, ASCII text executable
-
./this: ERROR: cannot open `./this' (No such file or directory)
-
is: ERROR: cannot open `is' (No such file or directory)
-
./readfile2.py: a python script, ASCII text executable
-
./readfile.py: a python script, ASCII text executable
-
./scanDir.py: a python script, ASCII text executable
-
./tmp: directory
-
./str.py: a python script, ASCII text executable
-
./readfile3.py: a python script, ASCII text executable
上述的方法无法奏效,需要改变分隔符
$ (IFS=$'\n';for file in $(find ./ -iname "*"); do file "$file"; done)
括号是必需的,表示括号里面的语句在一个子Shell中,这样IFS的改变不会影响整个终端
结果如下:
-
$ (IFS=$'\n';for file in $(find ./ -iname "*"); do file "$file"; done)
-
./: directory
-
./sql.py: a python script, ASCII text executable
-
./this is: empty
-
./readfile2.py: a python script, ASCII text executable
-
./readfile.py: a python script, ASCII text executable
-
./scanDir.py: a python script, ASCII text executable
-
./tmp: directory
-
./str.py: a python script, ASCII text executable
-
./readfile3.py: a python script, ASCII text executable
个人积累的Find命令使用方式就这么多了,不过一般情况而言上面所述已经足够使用
阅读(2127) | 评论(0) | 转发(0) |