使用 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 | # 文件格式说明 |
注:如果日期和星期同时被设定,那么其中的一个条件被满足时,指令便会被执行。
在一个区域里填写多个数值的方法:
- 逗号(,)表示列举,例如:
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 倒是能正常导出,回来再试吧)