-exec rm 与 xargs rm -rf 深度剖析
目录
前言
我们在 linux 机器上删除搜索到的文件和目录时,总会遇到这样的抉择:对于 -exec rm -rf 和 xargs rm -rf 两个命令,应该用哪个呢?而且网上很多文章简直不负责任,有的甚至把二者的区别写反了。今天这篇文章就算拨乱反正啦。
正文
相同点
二者都可以删除指定的目录或者文件,而且都是强制删除。
不同点
二者在具体的执行策略上有所不同,下面详细介绍。
-exec rm
exec 命令用来调用并执行指定的其他命令。但是,我们比较推荐在 shell 脚本程序中使用 exec 命令,调用其他的命令。因为如果在当前终端中使用该命令,则当指定的命令执行结束后会立即退出终端。(友情提示:大家动手尝试时千万要注意呦)
示例命令:
exec ls
如果你想尝试 exec 命令的这个特性,可以新打开一个终端,然后复制上面的命令,看一看效果!
最后,提醒大家需要注意的是 exec 命令必须由一个 ; 结束,因为 shell 一般会对 ; 进行解析,所以借用转义字符 \; 防止这种情况发生。另外,上面的命令不能直接执行目录和文件,完整的命令如下:
exec rm {} \;
其中,{} 用来接受其他命令传入的参数集合,比如搜索当前目录下所有的日志文件并删除,命令如下:
find ./ -name "*.log" -exec rm {} \;
注意:和其他命令一起使用时,前边需要加链接符 - ,但是使用时不需要。
xargs rm -rf
xargs 命令的作用是给别的命令传递参数,一般会配合管道符 | 来使用,把前一命令的 stdout 输出作为自己的 stdin 输入,再转换成 command line 形式的参数传给其它命令。
相比较 exec 单次执行所有参数集合,xargs 命令会将最终的命令转换成单独的命令再执行,从而在一定程度上避免“参数太多”类似的错误。因此,在进行大量文件和目录删除操作时,比较推荐使用 xargs 命令。
好了,为了更加形象的对比二者在使用时的区别,现在使用 xargs 命令搜索并删除当前目录下的所有日志文件,应该使用什么命令呢,具体命令如下:
find ./ -name "*.log" | xargs rm -rf
是不是更加简单?至少个人是这么认为的,比较符合我们一般组合命令的使用习惯。
下面简单看一下 xargs 命令的其他用法,打印文件名字符串,具体效果如下图所示:
作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄
版权声明: 本文为 InfoQ 作者【liuzhen007】的原创文章。
原文链接:【http://xie.infoq.cn/article/57da5d1a4b46a63a2e993b6f2】。文章转载请联系作者。
评论