【问题标题】:Bash script fails on creating directory in WebDAVBash 脚本在 WebDAV 中创建目录失败
【发布时间】:2016-10-06 22:30:59
【问题描述】:

对于我的 VPS,我创建了一个 bash 脚本,该脚本将由 cronjob 每三个小时运行一次,用于备份我的 VPS。所有数据库(在这种情况下)都将被转储并移动到通过 WebDAV 连接的存储服务上的新文件夹中。

它运行完美,直到昨天。脚本给了我错误:

mkdir: 无法创建目录'/stack/VPS-Backups/Srv1/Database/07-10-2016_12:00': 没有这样的文件或目录

脚本(出错的地方):

#!/bin/bash

DB_BACKUP="/stack/VPS-Backups/Srv1/Database/`date +%d-%m-%Y`_`date +%H:%M`"

# Create the backup directory
mkdir $DB_BACKUP

我已经检查/处理了以下事情:

  • 重新挂载 WebDAV
  • 检查目录结构“/stack/VPS-Backups/Srv1/Database”是否存在
  • WebDAV 的 URL/用户名/密码没有改变
  • 存储存储的供应商没有改变任何事情

我能做什么?感谢您的帮助! :-)

【问题讨论】:

  • 你确定这是脚本吗?我在失败的路径前面看到一个~
  • 对不起,我的错;错字。修复它:)
  • 在这种情况下,“没有这样的文件或目录”的简单解读是父目录实际上存在。非同寻常的主张、非同寻常的证据等。
  • 我还建议进行一些一般性的实验。 mkdir foo 有效吗?您可能有一个更普遍的问题需要在服务器端进行调查。
  • 顺便说一句,%d-%m-%Y 是一种选择不当的日期格式。如果您对其有任何控制权,请考虑改用%Y%m%d - 这样您的日期的 ASCII 排序顺序就会匹配它们的逻辑排序顺序。

标签: linux bash ubuntu webdav


【解决方案1】:
#!/bin/bash
dirname=$(date '+%Y%m%dT%H%M') # subset of an ISO 8601 date (only missing %S)
cd /stack/VPS-Backups/Srv1/Database || exit
mkdir -- "$dirname"

这里封装的显着变化:

  • cdmkdir 分开,以明确哪些操作失败了。
  • 删除 POSIX 不保证在文件名中有效的字符(portable filename character set)。实际上,这意味着冒号需要去掉。

此外,这遵循ISO 8601 日期格式准则。这意味着其他软件将能够将您的目录名称解析为开箱即用的日期。使用 YYYYMMDD 还可以防止 MMDDYYYY 和 DDMMYYYY 之间的混淆,并使您的姓名的 ASCII 排序顺序与其逻辑排序顺序相匹配,因此您可以使用标准 UNIX 工具进行范围选择。

【讨论】: