使用 R 根据元数据重命名 folders/directories
Rename folders/directories based on metadata with R
我有一个关于根据元数据框中的信息重命名文件夹的问题。在下面你会发现我的目录结构和元数据信息的例子。
元数据框:
date
Sample_name
S_number
2021_05_20
V_3_4
S1
2021_05_20
V_9_4
S2
2021_05_20
H_13_5
S3
目录结构:
main Directory
|
|___ 2021_metadata.txt
|___ Experiment
├── D0
├── Weather
|__ S1
|__ S2
│ └── Temperature
|__ S1
|__ S2
└── D1
├── Weather
|__ S1
|__ S2
|__ S3
└── Temperature
我不太熟悉 R,但我认为可以使用 R 的 file.rename() 函数手动重命名文件夹。但是,我想要的是编写一个代码能够识别文件夹的名称并将其重命名为在元数据文件中找到的相应 sample_name。例如文件夹名称是 S1 并将其更改为 V_3_4?
有人能帮我解决这个问题吗?
提前谢谢你
编辑
name_file <- "./20210325_metadata_r_test_1.txt"
Metadataframe <- read.delim(name_file)
dirs <- list.dirs(path = "./experiment/", recursive = TRUE, full.names = TRUE)
if(any(dirs %in% Metadataframe$S_number)){
for(dir in dirs[which(dirs %in% Metadataframe$S_number)]){
shell(paste("move", dir, Metadataframe$Sample_name[which(Metadataframe$S_number == dir)]))
}
}
您可以使用 list.dirs('/path', recursive = F, full.names = F)
查找当前目录名称(例如 S1、S2、...)。然后您可以使用 system(paste('mv', old_dir, new_dir))
更改名称
示例:
main_dir
└── experiment
└── D0
├── temperature
│ ├── S1
│ └── S2
└── weather
├── S1
└── S2
Metadataframe <- data.frame(Sample_name = c("V_3_4", "V_9_4", "H_13_5"), S_number = c("S1", "S2", "S3"))
setwd("~/main_dir/experiment/D0/temperature/")
dirs <- list.dirs('./', recursive = F, full.names = F)
if(any(dirs %in% Metadataframe$S_number)){
for(dir in dirs[which(dirs %in% Metadataframe$S_number)]){
system(paste("mv", dir, Metadataframe$Sample_name[which(Metadataframe$S_number == dir)]))
}
}
main_dir
└── experiment
└── D0
├── temperature
│ ├── V_3_4
│ └── V_9_4
└── weather
├── S1
└── S2
您可以将所有这些放入 for 循环中以执行所有文件夹。
编辑:更改所有目录:
main_dir
└── experiment
├── D0
│ ├── temperature
│ │ ├── S1
│ │ └── S2
│ └── weather
│ ├── S1
│ └── S2
└── D1
├── temperature
│ ├── S1
│ ├── S2
│ └── S3
└── weather
├── S1
├── S2
└── S3
Metadataframe <- data.frame(Sample_name = c("V_3_4", "V_9_4", "H_13_5"), S_number = c("S1", "S2", "S3"))
dirs <- list.dirs('~/main_dir', recursive = TRUE, full.names = TRUE)
if(any(grepl(paste(Metadataframe$S_number, collapse = "|"), dirs))){
for(dir in dirs[grep(paste(Metadataframe$S_number, collapse = "|"), dirs)]){
dir_path <- sub("S[0-9]+", "", dir)
sample <- sub(dir_path, "", dir)
new_path <- paste0(dir_path, Metadataframe$Sample_name[which(Metadataframe$S_number == sample)])
system(paste("mv", dir, new_path))
}
}
main_dir
└── experiment
├── D0
│ ├── temperature
│ │ ├── V_3_4
│ │ └── V_9_4
│ └── weather
│ ├── V_3_4
│ └── V_9_4
└── D1
├── temperature
│ ├── H_13_5
│ ├── V_3_4
│ └── V_9_4
└── weather
├── H_13_5
├── V_3_4
└── V_9_4
我有一个关于根据元数据框中的信息重命名文件夹的问题。在下面你会发现我的目录结构和元数据信息的例子。
元数据框:
date | Sample_name | S_number |
---|---|---|
2021_05_20 | V_3_4 | S1 |
2021_05_20 | V_9_4 | S2 |
2021_05_20 | H_13_5 | S3 |
目录结构:
main Directory
|
|___ 2021_metadata.txt
|___ Experiment
├── D0
├── Weather
|__ S1
|__ S2
│ └── Temperature
|__ S1
|__ S2
└── D1
├── Weather
|__ S1
|__ S2
|__ S3
└── Temperature
我不太熟悉 R,但我认为可以使用 R 的 file.rename() 函数手动重命名文件夹。但是,我想要的是编写一个代码能够识别文件夹的名称并将其重命名为在元数据文件中找到的相应 sample_name。例如文件夹名称是 S1 并将其更改为 V_3_4?
有人能帮我解决这个问题吗? 提前谢谢你
编辑
name_file <- "./20210325_metadata_r_test_1.txt"
Metadataframe <- read.delim(name_file)
dirs <- list.dirs(path = "./experiment/", recursive = TRUE, full.names = TRUE)
if(any(dirs %in% Metadataframe$S_number)){
for(dir in dirs[which(dirs %in% Metadataframe$S_number)]){
shell(paste("move", dir, Metadataframe$Sample_name[which(Metadataframe$S_number == dir)]))
}
}
您可以使用 list.dirs('/path', recursive = F, full.names = F)
查找当前目录名称(例如 S1、S2、...)。然后您可以使用 system(paste('mv', old_dir, new_dir))
示例:
main_dir
└── experiment
└── D0
├── temperature
│ ├── S1
│ └── S2
└── weather
├── S1
└── S2
Metadataframe <- data.frame(Sample_name = c("V_3_4", "V_9_4", "H_13_5"), S_number = c("S1", "S2", "S3"))
setwd("~/main_dir/experiment/D0/temperature/")
dirs <- list.dirs('./', recursive = F, full.names = F)
if(any(dirs %in% Metadataframe$S_number)){
for(dir in dirs[which(dirs %in% Metadataframe$S_number)]){
system(paste("mv", dir, Metadataframe$Sample_name[which(Metadataframe$S_number == dir)]))
}
}
main_dir
└── experiment
└── D0
├── temperature
│ ├── V_3_4
│ └── V_9_4
└── weather
├── S1
└── S2
您可以将所有这些放入 for 循环中以执行所有文件夹。
编辑:更改所有目录:
main_dir
└── experiment
├── D0
│ ├── temperature
│ │ ├── S1
│ │ └── S2
│ └── weather
│ ├── S1
│ └── S2
└── D1
├── temperature
│ ├── S1
│ ├── S2
│ └── S3
└── weather
├── S1
├── S2
└── S3
Metadataframe <- data.frame(Sample_name = c("V_3_4", "V_9_4", "H_13_5"), S_number = c("S1", "S2", "S3"))
dirs <- list.dirs('~/main_dir', recursive = TRUE, full.names = TRUE)
if(any(grepl(paste(Metadataframe$S_number, collapse = "|"), dirs))){
for(dir in dirs[grep(paste(Metadataframe$S_number, collapse = "|"), dirs)]){
dir_path <- sub("S[0-9]+", "", dir)
sample <- sub(dir_path, "", dir)
new_path <- paste0(dir_path, Metadataframe$Sample_name[which(Metadataframe$S_number == sample)])
system(paste("mv", dir, new_path))
}
}
main_dir
└── experiment
├── D0
│ ├── temperature
│ │ ├── V_3_4
│ │ └── V_9_4
│ └── weather
│ ├── V_3_4
│ └── V_9_4
└── D1
├── temperature
│ ├── H_13_5
│ ├── V_3_4
│ └── V_9_4
└── weather
├── H_13_5
├── V_3_4
└── V_9_4