我试图使用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"/"
//但目录创建成功
答案 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/`
...这可能会节省多年的用户时间。