如何在周数发生变化时立即运行脚本?

如何在周数发生变化时立即运行脚本?

我想对我的下载文件夹进行排序。我的目标是将本周的文件放在下载文件夹中,并将较旧的文件放在以这些文件的创建日期的周数和年份(例如 2013.09,按字典顺序排序)命名的文件夹中。

我只希望这适用于在下载文件夹根部找到的文件和文件夹;tar下载完成后,浏览器有时会自动扩展档案和其他档案。

当前位于下载文件夹根目录的文件和文件夹被假定为本周的文件和文件夹。但是,mtime 和 ctime 并不告诉文件何时实际完成下载。

如果机器一直处于开机状态,我可以设置一个 cron 任务,在周数发生变化时立即运行,但这是一台笔记本电脑,当我不使用它时,我会将其置于待机模式。

答案1

将 crontab 设置为:

@reboot the-script
0 0 * * 1 the-script
0 0 1 1 * the-script

在周一和每次启动时完成它。在 中the-script,检查是否已经完成。 (如果使用%W表示周数,则还需要在 1 月 1 日执行此操作(感谢 Gilles),如果使用 ISO 8061 周数 (%V),则不需要)。

如果您cron不支持@reboot,则必须将其添加到启动脚本中。

或者只是每天运行它并执行类似的操作(假设GNU find,所以不是 OS/X,尽管您可以将 OS/Xstat-exec ... {} +.

 cd ~/Download || exit
 find . -path './20[0-9][0-9].[0-9]*' -prune -o -type f -mtime +7 -printf '%p\0%TY.%TW\0' |
   xargs -r0n2 sh -c 'mkdir -p "$2" && exec mv -i "$@"' sh

(未经测试)

或者与zsh

zmodload zsh/stat
cd ~/Download || exit
for f (**/*~20[0-9][0-9].[0-9]*(.DNm+7)) {
  zstat -A d -F %Y.%W -- $f &&
    mkdir -p $d &&
    mv -i -- $f $d
}

如果您不想递归地执行此操作,则更简单:

zmodload zsh/stat
cd ~/Download || exit
for f (*(.DNm+7)) {
  zstat -A d -F %Y.%W -- $f &&
    mkdir -p $d &&
    mv -i -- $f $d
}

如果最后修改时间不反映下载时间,那么您也许可以使用出生时间。这次使用 OS/X findstat并且xargs(并且-maxdepth 1使用不是递归):

find . -type f -maxdepth 1 -Btime +7 \
  -exec stat -nf%SB -t%Y.%W {} \; \
  -exec printf '\0' \; \
  -print0  | xargs -0n2 sh -c '
  mkdir -p "$1" && mv -i "$2" "$1"' sh

相关内容