最近在整理一些视频和照片时发现,这些文件的命名方式很乱,有的是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)了,大家如果有兴趣可以自行去下载。有任何问题也欢迎随时交流!