![在文件名中转义 mm/dd/YY 备份日期](https://linux22.com/image/150747/%E5%9C%A8%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E8%BD%AC%E4%B9%89%20mm%2Fdd%2FYY%20%E5%A4%87%E4%BB%BD%E6%97%A5%E6%9C%9F.png)
我一直在努力:
cp file.csv file.$(date +%D).csv
但它失败了,因为文件名是:file.03/27/19.csv
带有单独目录的斜杠。
我一直在再次尝试:
cp file.csv file.$(printf "%q" $(date +%D)).csv
但它仍然失败。
答案1
/
文件名、句点中不能包含(基于 ASCII 的系统上的字节 0x2F)。
您可以使用类似于/
( ∕
U+2215 除号斜杠) 或⁄
(U+2044 分数斜杠,尽管在当前语言环境中使用的字符集中较少) 的字符,因此您可以这样做(前提是 U+2215 字符存在于语言环境中)字符集,包括GBK、BIG5、UTF-8、GB18030):
cp file.csv "file.$(date +%D | sed 's|/|∕|g').csv"
或者使用一些 shell(zsh
至少bash
):
cp file.csv "file.$(date +%D | sed $'s|/|\u2215|g').csv"
(这里使用sed
而不是tr
因为包括 GNU 在内的一些tr
实现tr
仍然不支持多字节字符)。
但是您可能会遇到问题,例如文件名在区域设置中使用与创建文件时使用的字符集不同的字符集呈现不同的问题(当然,当用户看到看起来像斜线的内容时,用户会感到困惑)文件名)。
我的建议是使用标准的明确格式(例如,对于美国以外的大多数人来说,2018 年 12 月 3 日将被解释为 2018 年 12 月 3 日)YYYY-mm-dd 格式(这也有助于 wrt 排序)):
cp file.csv "file.$(date +%Y-%m-%d).csv"
通过许多date
实现,您可以缩短为:
cp file.csv "file.$(date +%F).csv"