欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux下如何实现对目录下所有文件按照创建时间/修改时间重命名

程序员文章站 2022-05-24 14:36:39
...

最近在整理一些视频和照片时发现,这些文件的命名方式很乱,有的是IMG开头的,有的是DISC开头的,还有的是MOV开头的,另外还有一些其他的,反正就是很乱,实在是不好整理。于是我就冒出一个想法,我给它们重命名一下好了,按照拍摄的时间顺序来命名,不就清晰了吗?

不过,貌似手头没有这样的软件和工具,去网上搜了一圈,也没有找到合适的。作为一个程序猿,那就自己动手写一个吧,分分钟的事情~~

思路其实很简单,首先定位到目标目录下,然后逐个分析其中的文件,提取该文件的创建日期,将其格式化为字符串,并将该文件重命名一下,就搞定了!

首先得解释一下,这里提取文件的创建时间,是利用的stat函数,该函数的原型为:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *path, struct stat *buf);

输入参数:文件路径(名),struct stat 类型的结构体;
返回参数:成功返回0,失败返回-1

struct stat 结构体详解:

struct stat
{
    dev_t     st_dev;     /* ID of device containing file 文件使用的设备号 */
    ino_t     st_ino;     /* inode number 索引节点号 */
    mode_t    st_mode;    /* protection 文件对应的模式,文件,目录等 */
    nlink_t   st_nlink;   /* number of hard links 文件的硬连接数 */
    uid_t     st_uid;     /* user ID of owner 所有者用户识别号 */
    gid_t     st_gid;     /* group ID of owner 组识别号 */
    dev_t     st_rdev;    /* device ID (if special file) 设备文件的设备号 */
    off_t     st_size;    /* total size, in bytes 以字节为单位的文件容量 */
    blksize_t st_blksize; /* blocksize for file system I/O 包含该文件的磁盘块的大小 */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated 该文件所占的磁盘块 */
    time_t    st_atime;   /* time of last access 最后一次访问该文件的时间 */
    time_t    st_mtime;   /* time of last modification 最后一次修改该文件的时间 */
    time_t    st_ctime;   /* time of last status change 最后一次改变该文件状态的时间 */
};

解释一下其中的几个时间概念:

1、访问时间(st_atime,accesstime):读取一次文件的内容,该时间便会更新。比如对这个文件使用less命令或者more命令。(ls、stat这样的命令不会修改文件访问时间)。

2、修改时间(st_mtime,modifytime):对文件内容修改一次便会更新该时间。例如使用vim等工具更改了文件内容并保存后,文件修改时间发生变化。通过ls –l列出的时间便是这个时间。要想看到文件访问时间可使用ls –ul命令。

3、改变时间(st_ctime,changetime):更改文件的属性便会更新该时间,比如使用chmod命令更改文件属性,或者执行其他命令时隐式的附带更改了文件的属性若文件大小等。

我这里使用的是修改时间st_mtime。因为我发现在linux系统下,对于照片、视频文件这类的媒体文件,它创建的时间就是最后一个修改的时间,读取和访问的动作并不会改变它这个时间值。

另外,其中有几个细节要注意:

1、重命名时记得要保留原文件的后缀名;
2、有可能会遇到同一秒钟拍摄了多张照片,于是会出现文件名重复的问题。所以此时要进行判断,自动增加后缀;

最后,我将具体的代码上传到我的码云空间(https://gitee.com/leon1741/RenameByTime.git)了,大家如果有兴趣可以自行去下载。有任何问题也欢迎随时交流!