使用 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