shell脚本中的mv命令问题

时间:2016-05-02 11:27:11

标签: linux bash shell

我试图使用shell脚本运行mv命令,但它给了我

mv: cannot stat `/opt/logs/merchantportal/logger.log.20160501.*': No such file or directory
mv: cannot stat `/opt/logs/merchantapi/logger.log.20160501.*': No such file or directory

//这是我的SHELL SCRIPT

#!/bin/bash
now="$(date +'%Y%m%d')"
merchantPortalLogsPath="/opt/logs/merchantportal"
merchantApiLogsPath="/opt/logs/merchantapi"
currentDate="$(date +%Y%m%d)"
olderDate="$(date "+%Y%m%d" -d "1 days ago")"
merchantPortalLogsPathBackup=$merchantPortalLogsPath"."$olderDate
merchantApiLogsPathBackup=$merchantApiLogsPath"."$olderDate

mkdir $merchantPortalLogsPathBackup
mkdir $merchantApiLogsPathBackup
echo $merchantPortalLogsPath"/logger.log."$olderDate".*" $merchantPortalLogsPathBackup"/"
echo $merchantApiLogsPath"/logger.log."$olderDate".*" $merchantApiLogsPathBackup"/"

mv $merchantPortalLogsPath"/logger.log."$olderDate".*" $merchantPortalLogsPathBackup"/"
mv $merchantApiLogsPath"/logger.log."$olderDate".*" $merchantApiLogsPathBackup"/"

//但目录创建成功

enter image description here

2 个答案:

答案 0 :(得分:5)

".*"

*置于双引号内会阻止shell将其视为通配符,而是将其视为文字*字符。相反,请更改脚本,使其不会引用*。例如:

mv ${merchantPortalLogsPath}/logger.log.${olderDate}.* ${merchantPortalLogsPathBackup}/
mv ${merchantApiLogsPath}/logger.log.${olderDate}.* ${merchantApiLogsPathBackup}/

注意:从技术上讲,实际上应该双引号变量扩展来处理带有空格和其他特殊字符的路径。但我没有表明只关注手头的问题。

答案 1 :(得分:-2)

存在日志目录,但这些目录中的日志文件没有。由于mv无法从数据中移出一个并不首先存在的日志文件,因此它会相当模糊地抱怨:

  

没有这样的文件或目录

注意:IMHO模糊的错误消息是文档/接口错误 - 如果错误只说:

  

没有这样的文件

并没有让用户想知道是否缺少目录它似乎不那么令人费解,因为该消息显然意味着文件所在的目录确实存在确实存在。

但请考虑这个令人震惊的 GNU mv示例,其中目录/tmp/a/不存在:

mv /tmp/a/b/c/d /tmp/foo

输出到STDERR:

mv: cannot stat '/tmp/a/b/c/d': No such file or directory

现在,目录/tmp/a/不存在,目录/tmp/b//tmp/a/b/c/以及文件/tmp/a/b/c/d也不存在。用户没有被指示哪些是问题,并且/tmp/不存在甚至可能(不寻常,但可能)。只需编写几行代码就可以输出一条错误消息,说明更有用的内容,例如:

mv: cannot stat '/tmp/a/b/c/d': `/tmp/` exists, but not directory `/tmp/a/` 

...这可能会节省多年的用户时间。