如何批量给自己的文件重命名
--by mk 2021-2-18 21:30
前面分享了:Linux命令行,菜鸟报错之隐藏在换行中的字符^M,我们下载下来的文件,那么好了,现在问题是我需要对下列500+文件进行个性化重命名,要在每个文件 前加上数据收集的年份区间,
是不是看得眼花缭乱。你要是不乱的话,反正我是乱了!!!
要是鼠标点点点,想想这个工作量,都是可怕。而且,中间还不能出错喔,万一年份搞错了,那 排查起来,可又是想跳楼的心都有。
那么,有没有更好的方法?
听过Jimmy老师的课的都知道啦,解决问题的能力,就是编程的能力。这种活,必须是代码批量处 理啊。。
OK,自己想要的最终命名格式为:把每个文件之前加上年份区间,而且保证每个文件的对应年份准确无 误,这样子:
把文件下载网站中的注释文件复制下载下来,其长这样:
保存成TXT文件,然后读进R,后面就开心的玩耍吧:
rm(list = ls())
##读入文件
dat <- data.table::fread('NHANESLaboratoryData.txt',
data.table = F)
##去除RDC Only文件,因为文件不对外开放,没有下载链接
library(tidyverse)
tmp <- str_detect(dat$`Data File`,'RDC Only')
tmp <- dat[!tmp,]
tmp$`Data File` <- unlist(lapply(str_split(tmp$`Data File`,' '),
function(x)x[[1]][1]))
##把文件夹下以XPT后缀的文件全部读取进来
xpt <- as.data.frame(list.files('.','.XPT'))
colnames(xpt) <- 'names'
处理后tmp文件就长这样了:
xpt读进来处理后成这样:
好办,通过xpt[,2]和tmp[,'Data File']列进行匹配,以确定自己是否全部文件已经下载完成。
最后就是拼接,tmp文件中,第一列(Years)和第四列(Data File)拼接起来:
mainNames <- unlist(lapply(str_split(xpt[,1],'\\.'), function(x)x[1]))
xpt <- mutate(xpt,mainNames = mainNames)
##通过xpt[,2]和tmp[,'Data File']列进行匹配
tmp <- tmp[tmp$`Data File` %in% xpt$mainNames,]
##构建最后重命名的文件名称,成为2003—2004_L06AGE_C.XPT
tmp$fileRename <- paste0(tmp$Years,'_',tmp$`Data File`,'.XPT')
tmp$`Data File` <- paste0(tmp$`Data File`,'.XPT')
##其实就是一个函数搞定,批量,无误!
file.rename(tmp$`Data File`,tmp$fileRename)
最后,文件重命名为:
完美!!这样看起来,极大利于后续处理了。任务完成!!!(偷偷的告诉你哟,file.rename函数来自 于base包的哟,xpt文件为SAS数据文件,可以通过R中,foreign包一键读取哟)
思考题:
为什么这个学生这个时候选择使用R语言去进行文件批量重命名呢,其实是有问题他Linux学的不够好,那么,亲爱的读者,你能写出一个Linux命令来代替它的R脚本吗?