Linux下touch命令详解及C/C++代码实现
touch 命令是创建新的空文件的最简单方法。它还用于更改现有文件和目录的时间戳(即最近访问和修改的日期和时间),是 UNIX/Linux 操作系统中使用的标准命令。touch 命令touch的语法是:touch [option] file_name(s)当不带任何选项使用时,用于创建没有任何内容的文件, 使用 touch 命令创建的文件是空的。 当用户在创建文件时没有要存储的数据时,可以使用此命
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)
更多推荐
所有评论(0)