之前对于 find 的水平仅仅停留在查找某个文件路径方面,看到别人在后面加 "-exec ... {} \; "感觉特别高大上,今天抽空细细回味了一番。
“你之所以看不到黑暗,是因为有人把它挡在你看不到的地方”。
“从来就没有什么岁月静好,只是有人替我们负重前行”。
Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。
如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
其语法格式如下:
find path -option [ -print ] [ -exec -ok command ] {} \;
我在 /opt 目录下创建了 1.txt,在 /root 目录下分别创建了 1.log、2.log、3.log,并追加了少量内容。
以下我们使用 exec 和 xargs 查找一些东西进行对比:
如果我们想要查找在 50 分钟内被修改(更新)过的文件可以表示如下
[root@reset ~]# find . -type f -cmin -50 -exec ls -l {} \;
-rw-r--r-- 1 root root 30 Dec 6 14:42 ./1.log
-rw-r--r-- 1 root root 28 Dec 6 14:43 ./3.log
-rw-r--r-- 1 root root 26 Dec 6 14:43 ./2.log
[root@reset ~]# find . -type f -cmin -50 |xargs ls -l
total 32
-rw-r--r-- 1 root root 30 Dec 6 14:42 1.log
-rw-r--r-- 1 root root 26 Dec 6 14:43 2.log
-rw-r--r-- 1 root root 28 Dec 6 14:43 3.log
drw-r-x--- 2 root root 4096 Dec 6 13:40 config
-rw-r----- 1 root root 55 Dec 5 14:38 master.dat
-rw-r----- 1 root root 32 Dec 5 14:39 test.dat
-rw-r----- 1 root root 127 Dec 5 15:15 w.sh
drw-r-x--- 2 root root 4096 Oct 23 16:37 zhouyuyao
查找指定目录下 30 分钟内被修改(更新)过的文件并查看文件大小可以表示如下
[root@reset ~]# find /opt/ -type f -cmin -30 -exec du -sh {} \;
4.0K /opt/1.txt
[root@reset ~]# find /opt/ -type f -cmin -30 |xargs du -sh
4.0K /opt/1.txt
当然也可以查看一天内修改(更新)过的文件
[root@reset ~]# find /opt/ -type f -ctime -1 -exec ls -l {} \;
-rw-r--r-- 1 root root 1413 Dec 6 15:58 /opt/1.txt
[root@reset ~]# find /opt/ -type f -ctime -1 |xargs ls -l
-rw-r--r-- 1 root root 1413 Dec 6 15:58 /opt/1.txt
以及一天前修改(更新)过的文件
[root@reset ~]# find /opt/ -type f -ctime +1 -exec ls -l {} \;
-rw-r--r-- 1 root root 37 Nov 25 16:25 /opt/jenkins/index.html
[root@reset ~]# find /opt/ -type f -ctime +1 |xargs ls -l
-rw-r--r-- 1 root root 37 Nov 25 16:25 /opt/jenkins/index.html
区别描述: 两者都是对符合条件的文件执行所给的 Linux 命令,而不询问用户是否需要执行该命令。
-exec:{} 表示命令的参数即为所找到的文件,以;表示 command 命令的结束。\ 是转义符,
因为分号在命令中还有它用途,所以就用一个 \ 来限定表示这是一个分号而不是表示其它意思。
-ok: 和 -exec 的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数
所给出的 shell 给出的这个命令之前,都会给出提示,让用户来确定是否执行。
xargs 要结合管道来完成
find [option] express |xargs command
相比之下,也不难看出各自的缺点
1、exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;
2、exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \; 作为命令的结束符,书写不便。
3、xargs 不能操作文件名有空格的文件;
综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,
那么使用 xargs 比较方便; 否则,就要用 exec 了。
参考资料
1. exec与xargs区别
2. Linux xargs 命令
3. Linux find命令
4. linux 中强大且常用命令:find、grep
5. linux xargs命令的使用及其与exec、管道的区别