touch 命令是创建新的空文件的最简单方法。它还用于更改现有文件和目录的时间戳(即最近访问和修改的日期和时间),是 UNIX/Linux 操作系统中使用的标准命令。
touch 命令
touch的语法是:
touch [option] file_name(s)
当不带任何选项使用时,用于创建没有任何内容的文件, 使用 touch 命令创建的文件是空的。 当用户在创建文件时没有要存储的数据时,可以使用此命令。
创建文件是我们最常做的事情之一,使用touch命令默认创建一个空文件。
POSIX标准定义的选项
-a 修改文件 file 的存取时间.-c 不创建文件 file.-m 修改文件 file file-r ref_file将参照文件 ref_file 相应的时间戳记的数值作为指定文件 file 时间戳记的新值.-t time使用指定的时间值 time 作为指定文件 file 相应时间戳记的新值.此处的 time 规定为如下形式的十进制数:[[CC]YY]MMDDhhmm[.SS]这里,CC为年数中的前两位,即“世纪数”;YY为年数的 后两位,即某世纪中的年数.如果不给出CC的值,则touch将把年数CCYY限定在1969--2068之内.MM为月数,DD为天 将把年数CCYY限定在1969--2068之内.MM为月数,DD为天数,hh为小时数(几点),mm为分钟数,SS为秒数.此处秒 的设定范围是0--61,这样可以处理闰秒.这些数字组成的时间是环境变量TZ指定的时区中的一个时间.由于系统 的限制,早于1970年1月1日的时间是错误的.
GNU版本touch选项
-a, --time=atime, --time=access, --time=use只修改存取时间.-c, --no-create如果要修改的文件不存在,此选项使touch不去创建它.-d, --date=time使用时间值 time 代替指定文件的戳记值.可以包含月份 名,时区名以及`am'和`pm'等等.-f 此选项用于兼容BSD版本的 touch(1).-m, --time=mtime, --time=modify只修改修改时间.-r file, --reference=file使用参照文件 file 的时间戳记值修改指定文件的时间戳 记.-t decimtime这里时间值 decimtime 的格式为MMDDhhmm[[CC]YY][.ss]从左至右分别是月份,日期,小时,分钟,可选的世纪和年,以及可选的秒. touch 将用这组数值修改指定文件的时间戳记.请注意,这个格式与POSIX标准所规定的格式并 不一样.
Linux 中的文件时间戳
在深入了解 touch 命令的用法之前,您首先需要了解文件时间戳。在 Linux 中,每个文件都有三个时间戳:访问时间 (atime)、修改时间 (mtime) 和更改时间 (ctime)。
要检查包括文件时间戳在内的文件状态,可以使用 stat 命令后跟文件名:
访问时间(atime) 是指上次查看文件但未编辑的时间。
修改时间(mtime) 表示文件被修改的时间。
更改时间(ctime) 显示对文件的元数据更改。 例如,文件权限更改。
使用touch命令创建一个空文件
touch 最基本的功能是创建一个空文件。 要在当前目录中创建一个空文件,请在文件名后键入
要在另一个目录中创建一个空文件,请将路径传递到文件名之前的目录:
如果已存在同名文件,则 touch 会将上次访问和修改时间更改为当前时间。使用 ll 验证该命令。 它将列出当前目录中的所有文件(隐藏文件除外),以便您验证新创建的文件。
使用touch 命令创建多个文件
要使用 touch 命令创建多个文件,您只需传递多个文件名,后跟一个空格:
填充文件
创建空文件后,下一步是使用另一个命令填充它。 我们将向您展示一些常用命令,例如 echo、printf 或 seq 来添加内容。
要查看新创建文件的内容,请键入 cat 后跟文件名.
更改文件修改时间
使用-m参数,touch文件时,文件存在只会更新mtime和ctime为当前时间。
更改文件访问时间
使用-a参数,touch文件时,文件存在只会更新atime和ctime为当前时间。
更新文件的特定时间戳
要将文件的访问和修改时间更新为 2022 年 2 月 1 日,您可以使用 -d 选项。 请记住将日期字符串和时间括在单引号中:
可以使用部分日期时间字符串。例如,只需要提供日期,如下面的 file 所示(在这种情况下,时间会自动设置为 0:00):
touch -d ‘14 May’ file
只需提供时间,如下所示,自动将日期更改为当前日期:
touch -d ‘14:24’ file
static void stime_darg(const char *arg, struct timeval *tvp)
{struct tm t = { .tm_sec = 0 };const char *fmt, *colon;char *p;int val, isutc = 0;tvp[0].tv_usec = 0;t.tm_isdst = -1;colon = strchr(arg, ':');if (colon == NULL || strchr(colon + 1, ':') == NULL)goto bad;fmt = strchr(arg, 'T') != NULL ? "%Y-%m-%dT%H:%M:%S" :"%Y-%m-%d %H:%M:%S";p = strptime(arg, fmt, &t);if (p == NULL){printf("out of range or illegal time specification: YYYY-MM-DDThh:mm:SS[.frac][tz]\n");}/* POSIX:点后必须至少有一位数字 */if ((*p == '.' || *p == ',') && isdigit((unsigned char)p[1])) /* isdigit 检查是否是十进制 */{p++;val = 100000;while (isdigit((unsigned char)*p)) {tvp[0].tv_usec += val * (*p - '0');p++;val /= 10;}}if (*p == 'Z') {isutc = 1;p++;}if (*p != '\0')printf("out of range or illegal time specification: YYYY-MM-DDThh:mm:SS[.frac][tz]\n");tvp[0].tv_sec = isutc ? timegm(&t) : mktime(&t);tvp[1] = tvp[0];
}
创建具有特定时间戳
要创建具有特定时间的新文件,请使用 -t 选项指定时间戳。 时间戳应采用以下格式 YYMMDDHHMM
touch -t 2022010502 file02
避免创建新文件
如果要更新重新存在文件的时间戳而不创建新文件,请使用 -c 选项:
使用另一个文件的时间戳
touch 命令允许用户使用另一个文件的时间戳而不是当前时间。
-r(即引用)选项后跟一个空格,然后是一个文件名,告诉 touch 使用该文件的时间戳而不是当前时间。
该命令用于使用另一个文件的时间戳。 此处 2022-2-2.log 文件使用文件 234.txt 的时间戳进行更新。
static void stime_file(const char *fname, struct timeval *tvp)
{struct stat sb;if (stat(fname, &sb))err(1, "%s", fname);TIMESPEC_TO_TIMEVAL(tvp, &sb.st_atim);TIMESPEC_TO_TIMEVAL(tvp + 1, &sb.st_mtim);
}
touch 命令C/C++实现
int main(int argc, char *argv[])
{if (gettimeofday(&tv[0], NULL) == -1) /* 获得当前精确时间(毫秒) */err(1, "gettimeofday");while ((ch = getopt(argc, argv, "A:acd:mr:t:")) != -1)switch(ch) {case 'A':Aflag = timeoffset(optarg);break;case 'a':aflag = 1;break;case 'c':cflag = 1;break;case 'd':timeset = 1;stime_darg(optarg, tv);break;case 'm':mflag = 1;break;case 'r':timeset = 1;stime_file(optarg, tv);break;case 't':timeset = 1;stime_arg1(optarg, tv);break;default:usage(myname);}argc -= optind;argv += optind;if (aflag == 0 && mflag == 0)aflag = mflag = 1;if (timeset) {if (Aflag) {/*将时间设置为与指定的偏移量时间。*/if (aflag)tv[0].tv_sec += Aflag;if (mflag)tv[1].tv_sec += Aflag;Aflag = 0; }} else {/*如果没有 -r 或 -t 标志,至少有两个操作数*/if (argc > 1) {strtol(argv[0], &p, 10);len = p - argv[0];if (*p == '\0' && (len == 8 || len == 10)) {timeset = 1;stime_arg2(*argv++, len == 10, tv);}}/* 两次默认相同*/tv[1] = tv[0];}}
编译运行:
总结
touch 命令是 UNIX/Linux 操作系统中使用的标准命令,用于创建、更改和修改文件的时间戳。
欢迎关注微信公众号【程序猿编码】,需要touch命令完整源码的添加本人微信号(c17865354792)