如何在 cronjob 中的较长路径名中使用模式列表?

问题描述 投票:0回答:1

每天我需要将四个文件从一个文件夹移动到一个子文件夹。 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

显然我错误地使用了模式列表。如何正确使用?

regex shell cron
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.