我的任务是创建一个bash脚本以在我们公司的Asterisk服务器上实施,该脚本应执行以下操作:
搜索/var/spool/asterisk/monitor/
目录及其子目录。
查找.wav和.mp3类型的文件,如果时间戳超过60天,则将其删除
在删除文件之后删除所有空目录。
这是我的代码:
#!/bin/bash
set -e
ASTDIR=/var/spool/asterisk/monitor/; #VAR to point to asterisk dir
find ${ASTDIR}. -type f -name '*.wav' -mtime +60 -exec rm {} \;#remove wav > 60 days
find ${ASTDIR}. -type f -name '*.mp3' -mtime +60 -exec rm {} \;#remove mp3 > 60 days
find ${ASTDIR} -type d -empty -delete ; # Delete any empty directories
exit;
但是我遇到的问题很多。我觉得我的逻辑很扎实,但是脚本似乎并没有产生我想要/期望的输出。
文件数量很大,因此可以理解,查找有时需要很长时间才能运行。
我已经在调试中运行了几次命令,输出如下:
+ find /var/spool/asterisk/monitor/. -type f -name '*.wav' -mtime +60 -exec rm '{}' ';'
据我所知,它会执行并永久挂起,我决定不耐烦,于是我决定让它坐下,后来我回来查看它据说已经完成运行,但是mp3文件早于60天没有被删除,这使我相信find命令实际上并未运行。
然后,我用find mp3交换了find wav命令,该命令花了一段时间才能运行,并且没有删除所有内容。
我很困惑自己可能做错了什么?
两个find-> rm命令都不起作用,我将它们注释掉,以尝试最后的find命令,该命令将删除空目录
甚至没有删除所有空目录。我在一个窗口中运行了脚本,并在与之相对的窗口中运行了watch -n1 ls -l | head -n20
,显然删除了一些空目录,但并不是全部。我确认这一点是因为我知道应该删除哪些目录,但是该命令仍然留下了一些空目录!
最上面的樱桃,请阐明我的困境!
这是CentOS服务器。
答案 0 :(得分:1)
您正在${ASTDIR}.
中搜索(请注意附加的点),该搜索可能不存在。尝试以下方法:
#!/bin/bash
astdir=/var/spool/asterisk/monitor/
find "$astdir" -type f -iname '*.wav' -mtime +60 -delete
find "$astdir" -type f -iname '*.mp3' -mtime +60 -delete
find "$astdir" -type d -empty -delete
如果变量中有空格,行尾不需要分号,find
具有删除文件的内置功能,则应始终加引号。 exit
来自脚本。我还使用了iname
表达式来确保不区分大小写的搜索。我的Asterisk安装创建了*.WAV
个文件。
您还可以使用-or
和-and
使用find来执行布尔语句,但是它需要使用需要转义的括号进行分组,因此可能更容易运行多个命令:
find "$astdir" \( -type f \( -iname '*.mp3' -or -iname '*.wav' \) -mtime +60 \) -or \( -type d -empty \)
答案 1 :(得分:-1)
编辑脚本如下所示,为我解决了我的问题:
#!/bin/bash
set -e
cd /var/spool/asterisk/monitor
find . -type f -name '*.mp3' -mtime +60 -delete
find . -type f -name '*.wav' -mtime +60 -delete
find . -type d -empty -delete
Amadan指出了诸如将rm替换为delete之类的更改,因为它更合乎逻辑,并且您至少知道它在做什么。