find-命令使用教程
1. find 常用命令
一般格式: find+目录名称+参数 参数: -name 文件名称
| '-cnewer file | 查找比file文件更新的文件 |
| '-not | 非,取反 |
| '-user | 文件所有人 |
| '-group | 文件所有组 |
| '-a | 并且关系 |
| '-o | 或者关系 |
| '-maxdepth | #最大深度 |
| '-mindepth | #最小深度 |
| '-size 20K | 查找大小为20K的文件 |
| '-size -20K | -表示小于;查找比20K小的文件 |
| '-size +20k | +表示大于;查看比20K大的文件 |
| '-type | #文件类型 |
|---|---|
| 类型代号 | 主要的文件类型 |
| f | #普通文件 |
| d | #目录 |
| b | #块设备 |
| s | #套接字 |
| c | #字符设备 |
| l | #链接 |
| p | #管道 |
| ctime 与 cmin | 都表示按照时间查找被篡改的文件 |
|---|---|
| ctime | 以天为单位 |
| cmin | 以分钟为单位 |
| '-cmin 10 | 查找文件更新距离现在10分钟的文件 |
| '-cmin +10 | 查找文件更新距离现在超过10分钟的文件 |
| '-cmin -10 | 查找文件更新距离现在10分钟以内的文件 |
| '-ctime +/-10 | 查找文件更新距离现在超过10天/10天以内的文件 |
2. exec与xargs区别
2.1. 两者都是对符合条件的文件执行所给的Linux 命令,而不询问用户是否需
- -exec:{}表示命令的参数即为所找到的文件,以;表示comman命令的结束。\是转义符, 因为分号在命令中还有它用途,所以就用一个\来限定表示这是一个分号而不是表示其它意思。
- -ok: 和 -exec 的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数 所给出的shell给出的这个命令之前,都会给出提示,让用户来确定是否执行。
- xargs 要结合管道来完成 格式:find [option] express |xargs command
用一个实例来看看exec和xargs是如何传参数的:
$find test/ -type f
test/myfile.name
test/files/role_file
test/files/install_file
$find test/ -type f |xargs echo
test/myfile.name test/files/role_file test/files/install_file
$find test/ -type f -exec echo {} \;
test/myfile.name
test/files/role_file
test/files/install_file
很明显,exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不 会出现命令行超长出报错的问题。
而xargs是把所有找到的文件名一股脑的转给命令。当文件很多时,这些文件名组合成的命 令行参数很容易超长,导致命令出错。
另外, find | xargs 这种组合在处理有空格字符的文件名时也会出错,因为这时执行的命令 已经不知道哪些是分割符、哪些是文件名中的空格! 而用exec则不会有这个问题。
比如做个演示:
$touch test/'test zzh'
$find test/ -name *zzh
test/test zzh
$find test/ -name *zzh |xargs rm
rm: cannot remove `test/test': No such file or directory
rm: cannot remove `zzh': No such file or directory
$find test/ -name *zzh -exec rm {} \;
2.2. 出各自的缺点
- exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;
- exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \; 作为命令的结束符,书写不便
- xargs 不能操作文件名有空格的文件;
3. -exec使用教程
综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件, 那么使用 xargs比较方便; 否则,就要用 exec了
3.1. exec参数说明
-exec 参数后面跟的是command命令 终止是以;为结束标志的 这句命令后面的分号是不可缺少的(考虑到各个系统中分号会有不同的意义,所以前面加反斜杠) {} 花括号代表前面find查找出来的文件名。
查找当前目录下的文件,并对查找结果执行ls -l 命令
#命令 find . -type f -exec ls -l {} \; #输出: [root@localhost home]# ls 1.log 2.log 3.c 4.log test [root@localhost home]# find -type f ./1.log ./2.log ./3.c [root@localhost home]# find -type f -exec ls -l {} \; -rw-r--r--. 1 root root 0 Nov 14 17:55 ./1.log -rw-r--r--. 1 root root 0 Nov 14 17:55 ./2.log -rwxrwxrwx. 1 root root 0 Nov 14 18:00 ./3.c查找当前目录下,24小时内更改过的文件,并进行删除操作删除没有提示
#命令 find -type f -mtime -1 -exec rm {} \; #输出 [root@localhost home]# ll total 0 -rw-r--r--. 1 root root 0 Nov 14 17:55 1.log -rw-r--r--. 1 root root 0 Nov 14 17:55 2.log -rwxrwxrwx. 1 root root 0 Nov 14 18:00 3.c drwxr-xr-x. 2 root root 6 Nov 14 18:16 4.log -rw-r--r--. 1 root root 0 Nov 15 18:02 5.log drwxr-xr-x. 2 root root 6 Nov 14 17:55 test [root@localhost home]# find -type f -mtime -1 ./5.log [root@localhost home]# find -type f -mtime -1 -exec rm {} \; [root@localhost home]# ls 1.log 2.log 3.c 4.log test一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式.-ok选项它将在对每个匹配到的文件进行操作之前提示你.
查找当前目录下文件名以.log结尾且24小时内更改过的文件,并进行安全删除操作,即删除前会进行询问
#命令: find -name "*.log" -type f -mtime -1 -ok rm {} \; #输出: [root@localhost home]# touch 6.c [root@localhost home]# touch 7.c [root@localhost home]# ls 1.log 2.log 3.c 4.log 6.log 7.c test [root@localhost home]# ll total 0 -rw-r--r--. 1 root root 0 Nov 14 17:55 1.log -rw-r--r--. 1 root root 0 Nov 14 17:55 2.log -rwxrwxrwx. 1 root root 0 Nov 14 18:00 3.c drwxr-xr-x. 2 root root 6 Nov 14 18:16 4.log -rw-r--r--. 1 root root 0 Nov 15 18:07 6.log -rw-r--r--. 1 root root 0 Nov 15 18:07 7.c drwxr-xr-x. 2 root root 6 Nov 14 17:55 test [root@localhost home]# find -name "*.log" -mtime -1 -ok rm {} \; < rm ... ./6.log > ? y [root@localhost home]# ll total 0 -rw-r--r--. 1 root root 0 Nov 14 17:55 1.log -rw-r--r--. 1 root root 0 Nov 14 17:55 2.log -rwxrwxrwx. 1 root root 0 Nov 14 18:00 3.c drwxr-xr-x. 2 root root 6 Nov 14 18:16 4.log -rw-r--r--. 1 root root 0 Nov 15 18:07 7.c drwxr-xr-x. 2 root root 6 Nov 14 17:55 test [root@localhost home]# ls 1.log 2.log 3.c 4.log 7.c test-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行
查找当前目录下的以.log结尾的文件或目录,并移动到test目录下
#命令: find -name "*.log" -exec mv {} test \; #输出: [root@localhost home]# tree . ├── 1.log ├── 2.log ├── 3.c ├── 4.log ├── 7.c └── test 2 directories, 4 files [root@localhost home]# find -name "*.log" -exec mv {} test \; [root@localhost home]# ls 3.c 7.c test [root@localhost home]# tree . ├── 3.c ├── 7.c └── test ├── 1.log ├── 2.log └── 4.log 2 directories, 4 files