使用shell脚本移动目录成功但报No such file or directory错误
问题现象
编写shell脚本实现从源目录移动符合条件的目录(非文件)到目标目录,移动操作实际执行成功,但运行时收到find命令相关的路径不存在报错。
报错示例:find: '/u01/app/oracle/diag/asm/+asm/+ASM1/trace/cdmp_dir_30days': No such file or directory
脚本输出
find /u01/app/oracle/diag/asm/+asm/+ASM1/trace/ -name 'cdmp*' -mtime +7 -exec mv '{}' /home/oracle/dba/backup/logs/l01nsvl-dtdao01/diag/asm/+asm/+ASM1/trace ';' find: `/u01/app/oracle/diag/asm/+asm/+ASM1/trace/cdmp_dir_30days': No such file or directory find: `/u01/app/oracle/diag/asm/+asm/+ASM1/trace/cdmp_dir_180days': No such file or directory find: `/u01/app/oracle/diag/asm/+asm/+ASM1/trace/cdmp_dir_7days': No such file or directory
手动执行输出
[oracle@l01nsvl-dtdao01:+ASM1:/u01/app/oracle/diag/asm/+asm/+ASM1/trace]$ ls -ltr $SOURCE total 3660 drwxr-----. 2 oracle oinstall 4096 Mar 12 2019 cdmp_dir_180days/ drwxr-xr-x. 2 oracle oinstall 20480 Aug 29 05:17 cdmp_dir_30days/ drwxr-xr-x. 2 oracle oinstall 36864 Sep 18 13:22 cdmp_dir_7days/ -rw-r-----. 1 oracle oinstall 3664330 Sep 27 10:52 alert_old.log -rw-r-----. 1 oracle oinstall 2899 Sep 28 14:52 alert_+ASM1.log -rwx------. 1 oracle oinstall 230 Sep 28 15:11 b* -rwx------. 1 oracle oinstall 395 Sep 28 15:25 a* [oracle@l01nsvl-dtdao01:+ASM1:/u01/app/oracle/diag/asm/+asm/+ASM1/trace]$ ls -ltr $TARGET total 0 [oracle@l01nsvl-dtdao01:+ASM1:/u01/app/oracle/diag/asm/+asm/+ASM1/trace]$ find /u01/app/oracle/diag/asm/+asm/+ASM1/trace/ -name 'cdmp*' -mtime +7 -exec mv '{}' /home/oracle/dba/backup/logs/l01nsvl-dtdao01/diag/asm/+asm/+ASM1/trace ';' find: `/u01/app/oracle/diag/asm/+asm/+ASM1/trace/cdmp_dir_30days': No such file or directory find: `/u01/app/oracle/diag/asm/+asm/+ASM1/trace/cdmp_dir_180days': No such file or directory find: `/u01/app/oracle/diag/asm/+asm/+ASM1/trace/cdmp_dir_7days': No such file or directory [oracle@l01nsvl-dtdao01:+ASM1:/u01/app/oracle/diag/asm/+asm/+ASM1/trace]$ ls -ltr $SOURCE total 3600 -rw-r-----. 1 oracle oinstall 3664330 Sep 27 10:52 alert_old.log -rw-r-----. 1 oracle oinstall 2899 Sep 28 14:52 alert_+ASM1.log -rwx------. 1 oracle oinstall 230 Sep 28 15:11 b* -rwx------. 1 oracle oinstall 395 Sep 28 15:25 a* [oracle@l01nsvl-dtdao01:+ASM1:/u01/app/oracle/diag/asm/+asm/+ASM1/trace]$ ls -ltr $TARGET total 88 drwxr-----. 2 oracle oinstall 256 Mar 12 2019 cdmp_dir_180days/ drwxr-xr-x. 2 oracle oinstall 36864 Aug 29 05:17 cdmp_dir_30days/ drwxr-xr-x. 2 oracle oinstall 45056 Sep 18 13:22 cdmp_dir_7days/
原因说明
find命令默认会递归遍历目标目录的所有子目录层级,当匹配到cdmp开头的目录后,会先执行mv操作把目录移走,后续find尝试进入该目录继续遍历内部内容时,发现目录已经不存在,就会抛出路径不存在的报错。这个报错属于执行逻辑的正常提示,不影响目录移动的实际结果。
修复方案
方案1(推荐)
给find命令添加-maxdepth 1参数,限制只扫描目标目录的当前层级,不进入子目录遍历,同时添加-type d参数确保只匹配目录,符合使用需求,修改后的命令如下:
find /u01/app/oracle/diag/asm/+asm/+ASM1/trace/ -maxdepth 1 -type d -name 'cdmp*' -mtime +7 -exec mv '{}' /home/oracle/dba/backup/logs/l01nsvl-dtdao01/diag/asm/+asm/+ASM1/trace \;
方案2
先将find匹配到的所有目标路径输出到临时列表,再遍历列表执行移动操作,避免find遍历过程中目录被移除的冲突。
内容的提问来源于stack exchange,提问作者Syed Ali
相关产品推荐
相关产品推荐

