使用 crontab 计划定时任务定时给学习资料列表

使用 crontab 计划定时任务定时给学习资料列表

是真的学习资料

前言

近期由于疫情的原因,只能呆在家里自主学习。然后老师在微信里发了一堆需要复习的文档和需要写的作业,并且我所在的天津市教育局也有相关的复习课程需要听。作为一个懒人,当然还是起不了床看电视视频的,于是每天都会从官方网站上下载下来视频存到电脑里回来再看,那么这一堆堆文件的存放就成了问题。(其实不是多大的问题,我感觉我这属于创造一个不需要的需求)
这篇文章主要是写了如何使用 crontab 来进行文件夹列表命令的。(目的挺水的,就随便写写)

准备

我用的系统是 MacOS Catalina 10.15.3,Shell是 Zsh 并安装了 oh-my-zsh。

由于我使用的 MacOS 并不自带我需要的 tree 命令,于是需要使用 Homebrew 进行安装:

brew install tree

如果系统内并没有 HomeBrew,请参考少数派的这篇文章

系统内是自带 Crontab 的,所以直接用就行了。

用法

将 shell 内容输出到文本可以使用 >>-->,例如:

neofetch --> ~/Documents/neofetch.txt

运行之后在 ~/Documents/ 下就会有个 neofetch.txt 的文件,里面是 neofetch 运行后的输出内容。

Crontab 的语法:

crontab [-u user] file

crontab [-u user] [-l | -r | -e] [-i] [-s]

其中:
-u user 就是需要进行定时的用户;
file 就是需要读取的 crontab 数据文件(如果file是-时,则shell会从终端读取标准输入(STDIN));
-l 是显示当前的 crontab;
-r 是移除当前的 crontab;
-e 是使用编辑器当前的 crontab(默认使用 vi 编辑,如果需要更改其他编辑器需要更改用户变量);
-i 作用同 -r,但是多了一个用户确认选项;
-s 仅用于 SELinux 情况。

关于 crontab 文件的格式:

被空格分开的每个区域叫做一个区域或叫做“域”。

/var/spool/cron 下的 crontab 文件是用户层次的(本文档仅涉及到用户层次,如需要在系统层次设定 crontab 则需要在被执行命令前添加需要指定的用户名),格式如下:

1
2
3
4
5
6
7
8
# 文件格式说明
# ┌──分钟(0 - 59)
# │ ┌──小时(0 - 23)
# │ │ ┌──日(1 - 31)
# │ │ │ ┌─月(1 - 12)
# │ │ │ │ ┌─星期(0 - 6,表示从周日到周六,在某些系统中星期日为7)
# │ │ │ │ │
# * * * * * 被执行的命令

注:如果日期和星期同时被设定,那么其中的一个条件被满足时,指令便会被执行。

在一个区域里填写多个数值的方法:

  • 逗号(,)表示列举,例如: 1,3,4,7 * * * * echo hello world 表示,在每小时的1、3、4、7分时,打印”hello world”。
  • 连词符(-)表示范围,例如:1-6 * * * * echo hello world ,表示,每小时的1到6分钟内,每分钟都会打印”hello world”。
  • 星号(*)代表任何可能的值。例如:在“小时域”里的星号等于是“每一个小时”。
  • 百分号(%) 表示“每”。例如:*%10 * * * * echo hello world 表示,每10分钟打印一回”hello world”。

其他内容请参阅 crontab 文档。(最下方参考资料中有放)

tree 命令的使用方式

以下内容复制自runoob.com

tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录...]

参数说明:

  • -a 显示所有文件和目录。
  • -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
  • -C 在文件和目录清单加上色彩,便于区分各种类型。
  • -d 显示目录名称而非内容。
  • -D 列出文件或目录的更改时间。
  • -f 在每个文件或目录之前,显示完整的相对路径名称。
  • -F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/“,”=”,”@”,”|”号。
  • -g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
  • -i 不以阶梯状列出文件或目录名称。
  • -I<范本样式> 不显示符合范本样式的文件或目录名称。
  • -l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
  • -n 不在文件和目录清单加上色彩。
  • -N 直接列出文件和目录名称,包括控制字符。
  • -p 列出权限标示。
  • -P<范本样式> 只显示符合范本样式的文件或目录名称。
  • -q 用”?”号取代控制字符,列出文件和目录名称。
  • -s 列出文件或目录大小。
  • -t 用文件和目录的更改时间排序。
  • -u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
  • -x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

正式使用

这部分具体应用内容贼短,主要是最近没有其他实际需求了… 就当 crontab 的一个实际使用了。

接下来是我的实际操作:

我是直接用的 crontab -e 命令进 vi 直接编辑的。(vi使用教程就不写了…)
进去先按 i 键进入编辑模式左下角会出现 [Insert] 的标示,然后直接复制进去已经编好的 corntab 内容,内容是:0 23 * * * tree '/Users/fds/iCloud云盘(归档)/停课不停学' -I "list" -N --> '/Users/fds/iCloud云盘(归档)/停课不停学/list/list.txt'

其中 0 23 * * * 代表每天的23点运行(也可以写成* 23 * * *);
tree 命令目录后面的 -I "list" 代表忽略需要 tree 的文件夹里的子文件夹 list;
-N 代表所有文字直接输出(不然中文字符会乱码)。

复制后直接按 escape 键 输入:wq即可保存。

之后在终端里输入 crontab -l 来检查 crontab 是否已经成功运行。

以上です。

(结果待更新,因为理论上到这就能结束了然而我输出完是个空文档… 不带 crontab 倒是能正常导出,回来再试吧)

参考资料

  1. https://zh.wikipedia.org/wiki/Cron
  2. https://www.computerhope.com/unix/ucrontab.htm
  3. https://www.runoob.com/linux/linux-comm-crontab.html
  4. https://translate.google.com/
  5. https://www.jianshu.com/p/15a96c1de695