find命令过滤 no such_linux find -exec rm -r 报No such file or directory

linux find -exec rm -r 报: No such file or directory

系统环境Ubuntu 16.04.3 LTS

在写批量制作docker镜像脚本时,先是将代码目录拷贝到对应的制作镜像的目录中,然后遍历镜像目录执行build,制作镜像,镜像build完成之后,再将代码目录删除,删除代码目录时用到find -exec组合命令,但是却报了:

No such file or directory

场景模拟:

zzfdeMacBook-Air:temp zzf$ mkdir testaaa

zzfdeMacBook-Air:temp zzf$ ls | grep testaaa

testaaa

zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -exec rm -r {} \;

find: ./testaaa: No such file or directory

再次查找testaaa目录,发现testaaa目录确实被删除了。但为什么会报: No such file or directory呢?

zzfdeMacBook-Air:temp zzf$ ls testaaa

ls: testaaa: No such file or directory

查阅了find的资料后发现,find 默认是递归查找,在执行上面的删除目录的组合命令时, 它会遍历testaaa目录, 实际执行过程如下:

查询当前目录下的所有目录

进行模式匹配"testaaa", 匹配成功? 成功。

执行exec后的命令: rm -r testaaa

find 尝试进入到testaaa/目录中,查找目录或文件,并执行exec后面的命令

find 没有找到testaaa目录,返回ENOENT(No such file or directory)

解决方法有很多种,下面只列出常用方式:

1. 使用find的 -maxdepth OPTIONS:

-maxdepth levels:指定tests和actions作用的最大目录深度,只能为非负整数。可以简单理解为目录搜索深度,但并非如此。当前path目录的层次为1,所以若指定-maxdepth 0将得不到任何结果。

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

testaaa

zzfdeMacBook-Air:temp zzf$

zzfdeMacBook-Air:temp zzf$ find . -maxdepth 1 -type d -name "testaaa" -exec rm -r {} \;

zzfdeMacBook-Air:temp zzf$ echo $?

0

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

ls: testaaa: No such file or directory

2. 使用find的 -prune ACTIONS:

-prune: 不进入目录(告诉find,不要在要删除的目录中查找子目录或文件),所以可用于忽略目录,但不会忽略普通文件。没有给定-depth时,总是返回true,如果给定-depth,则直接返回false,所以-delete(隐含了-depth)是不能和-prune一起使用的

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

testaaa

zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -prune -exec rm -r {} \;

zzfdeMacBook-Air:temp zzf$ echo $?

0

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

ls: testaaa: No such file or directory

3. 使用find的 -delete ACTIONS:

-delete,它隐含"-depth"选项

-depth: 搜索到目录时,先处理目录中的文件(子目录),再处理目录本身。对于"-delete"这个action,它隐含"-depth"选项

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

testaaa

zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -delete

zzfdeMacBook-Air:temp zzf$ echo $?

0

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

ls: testaaa: No such file or directory

4. 使用 + (加号)作为find命令的终止符,而不使用 ; (分号)

+ 和 ; 区别:

; 是find遍历一次执行一次exec后面的command, 而 + 会拆分批量找到的文件或目录,批次运行命令,所以不会返回错误,而且当查找内容过多时, + 会降低CPU使用率。

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

testaaa

zzfdeMacBook-Air:temp zzf$ find . -type d -name "testaaa" -exec rm -r {} +

zzfdeMacBook-Air:temp zzf$ echo $?

0

zzfdeMacBook-Air:temp zzf$ ls -d testaaa

ls: testaaa: No such file or directory

当然也可以使用 | (管道) + xargs 的方式:

find . -type d -name "testaaa" | xargs rm -r

但是当testaaa并不存在时,执行这个组合命令,会返回一个非0的状态码,并不符合我的场景。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值