每天我需要将四个文件从一个文件夹移动到一个子文件夹。 5月26日,这些是昨天的文件:
changes-ar-240525.txt
changes-dp-240525.txt
planned-ar-240525.txt
planned-dp-240505.txt
使用 cronjob,我可以自动将每个单独的文件移动到子文件夹中,如下所示:
16 2 * * * mv /path/changes-ar-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
17 2 * * * mv /path/changes-dp-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
18 2 * * * mv /path/planned-ar-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
19 2 * * * mv /path/planned-dp-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
我想使用模式列表通过单个 cronjob 来完成此操作。我试过了:
18 2 * * * mv /path/path/@(changes|planned)-@(ar|dp)-`date -d "1 day ago" "+\%y\%m\%d"`.txt /path/subfolder
但它返回一个错误:
/bin/sh: 1: Syntax error: "(" unexpected
显然我错误地使用了模式列表。如何正确使用?
chrond
使用 /bin/sh
。在某些操作系统中,可以通过在 crontab 开头添加 SHELL=/bin/bash
来修改它。
但是在这里你甚至尝试使用默认情况下可能不支持的 bash 扩展全局匹配;这将是一个问题,因为你无法在一行中打开它,例如:
#!/bin/bash
shopt -u extglob # unset extended globing
# try to enable it and use it in a single line
shopt -s extglob; echo @(*)
bash: syntax error near unexpected token `('
一个可靠的解决方法是使用大括号并直接在 crontab 中调用 bash:
18 2 * * * bash -c 'mv /path/path/{changes,planned}-{ar,dp}-"$(date -d "1 day ago" "+\%y\%m\%d")".txt /path/subfolder