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 path/to/emptyFile
如果已存在同名文件,则 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)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐