簡體   English   中英

在 R 中使用相同的模式重命名文件和目錄

[英]Renaming files and directories with the same pattern in R

我正在嘗試使用新名稱重命名一些文件和文件夾。

舊名稱示例: corrected_original_wh_ah108090.pdf

示例新名稱: corrected_original_gsmp01358_108090.pdf

舊路徑示例: Data/Test2/ARGOS/wh_ah108090/crawl/corrected_original_wh_ah108090.pdf

示例新路徑: Data/Test2/ARGOS/gsmp01358_108090/crawl/corrected_original_gsmp01358_108090.pdf

元數據示例:

old         new
wh_ah108090 gsmp01358_108090
wh_ah108091 gsmp01359_108091
wh_ah108092 gsmp01360_108092
wh_ah108093 gsmp01361_108093
wh_ah108096 gsmp01362_108096
wh_ah108102 gsmp01363_108102
wh_ah108106 gsmp01364_108106

代碼:

# Read metadata for ID's #
meta <- read.csv('Metadata.csv')


# list all file paths
pathLs <- list.files('Data/Test2/', recursive = TRUE, full.names = TRUE)


# select only files with old format on the list (for full dataset where some files already have new name)
tbl<- pathLs [!grepl("gsmp", pathLs )]

# select only files with old format on metadata
metadata<- meta[!meta$old =="",]

# function to change old names for new
fileList <- apply(metadata,1, 
                 function(x) {
                 fnam <- x['old']
                 fnam <- as.character(unlist(fnam))


                 newnam <- gsub(fnam, as.character(unlist(x['new'])), tbl[grepl(fnam, tbl)])
                 return(newnam)})

# Create dataframe with old and new names

to <- as.character(unlist(fileList))
from <- tbl 

# Use rename 
file.rename(from, to)

由於某種原因,此文件重命名不起作用。 這是因為我無法同時重命名路徑中的文件和目錄嗎?

不需要循環。

metadata <- read.table(header=T, stringsAsFactors=F, text="
old         new
wh_ah108090 gsmp01358_108090
wh_ah108091 gsmp01359_108091
wh_ah108092 gsmp01360_108092
wh_ah108093 gsmp01361_108093
wh_ah108096 gsmp01362_108096
wh_ah108102 gsmp01363_108102
wh_ah108106 gsmp01364_108106")
metadata$new2 <- sprintf("gsmp%05d_%s",
                         1357L + seq_len(nrow(metadata)), # 1357 can be anything?
                         gsub("\\D", "", metadata$old))
metadata
#           old              new             new2
# 1 wh_ah108090 gsmp01358_108090 gsmp01358_108090
# 2 wh_ah108091 gsmp01359_108091 gsmp01359_108091
# 3 wh_ah108092 gsmp01360_108092 gsmp01360_108092
# 4 wh_ah108093 gsmp01361_108093 gsmp01361_108093
# 5 wh_ah108096 gsmp01362_108096 gsmp01362_108096
# 6 wh_ah108102 gsmp01363_108102 gsmp01363_108102
# 7 wh_ah108106 gsmp01364_108106 gsmp01364_108106

file.rename(metadata$old, metadata$new2) # should do it

list.files不列出任何目錄名稱,因此您的代碼只重命名文件,而不是目錄。 所以,理論上你的代碼應該可以工作。 具體來說,代碼的哪一部分不起作用?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM