最近在整理一些视频和照片时发现,这些文件的命名方式很乱,有的是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、有可能会遇到同一秒钟拍摄了多张照片,于是会出现文件名重复的问题。所以此时要进行判断,自动增加后缀;