我在目录文件夹中存储了许多(子)文件夹。每个子文件夹包含5-35个.jpg航空照片文件,这些文件由航线名称和编号命名(即:bej-3-83)。我想根据它们存储在的子文件夹为每个文件添加一个后缀。例如,如果'bej-3-83'存储在'T13N_10W'子文件夹中,我希望我的R脚本将'bej-3-83'重命名为'bej-3-83-T13N_10W'等等,以便存储在每个文件中每个子文件夹。
我可以部分地完成这个过程,尽管仍然需要比我使用这个脚本更多的手动输入:
folder = "C:\\...\\T23N_R14W"
files <- list.files(folder,pattern = "\\.jpg$",full.names = T)
files
sapply(files,FUN=function(eachPath){
file.rename(from=eachPath,to= sub(pattern="_clip", paste0("_T23N_R14W"),eachPath))
})
但正如您所看到的,此脚本使用子文件夹名称的手动粘贴输入,当您尝试创建一个我需要的脚本时,该文件无效。
我看到类似的问题和答案,它们使用'pushd'和'popd',并且我已经将下面的那些线程作为链接附加。我试图尽可能多地阅读这些功能,但到目前为止,让它工作的过程让我感到困惑。
How to rename files in folders to foldername using batch file
此致
亨利
答案 0 :(得分:0)
您可能需要在Windows上将dir_separator
更改为\
:
make_filename <- function(file_path) {
s <- unlist(strsplit(file_path, dir_separator))
fname <- gsub('\\.jpg$', '', s[length(s)])
parent_dir <- s[(length(s) - 1)]
new_fname <- paste0(parent_dir, "_", fname, '.jpg')
path <- paste(s[-length(s)], collapse = dir_separator)
return(paste(path, new_fname, sep = dir_separator))
}
folder = './data'
dir_separator = '/'
files <- paste0(folder, dir_separator, list.files(folder, recursive = T))
sapply(files, function(x) file.rename(from = x, to = make_filename(x)))
答案 1 :(得分:0)
递归方法。
将包含文件的根文件夹和要重命名的文件扩展名的路径传递给rename_batch
。
默认值是工作目录和jpeg。
library(stringr)
# An auxiliary function
rename_file <- function(str, extra){
file_name <- tools::file_path_sans_ext(str)
file_ext <- tools::file_ext(str)
return(paste0(file_name, '-', extra, '.', file_ext))
}
rename_batch <- function(path = "./",
extension = 'jpeg'){
# Separate files from folders
l <- list.files(path)
files <- l[grepl(paste0("\\." , extension), l)]
folders <- list.dirs(path, F, F)
present_folder <-
stringr::str_extract(path, '(?<=/)([^/]+)$')
# Check if there is a / at the end of path and removes it
# for consistency
path_len <- nchar(path)
last <- substr(path, path_len, path_len)
if (last == '/') {
path <- substr(path, 1, path_len - 1)
}
if (length(files) > 0) {
file_updtate <- paste0(path, '/', files)
file.rename(file_updtate, rename_file(file_updtate, present_folder))
}
if (length(folders) > 0) {
for (i in paste0(path, '/', folders)) {
cat('Renaming in:', i, '\n')
rename_batch(i)
}
}
}