2017-11-29 34 views
0

디렉터리 폴더 내에 여러 개의 (하위) 폴더가 저장되어 있습니다. 각 하위 폴더에는 비행편 이름과 번호로 이름이 지정된 5-35 개의 .jpg 항공 사진 파일이 들어 있습니다 (예 : bej-3-83). 나는 그들이 저장되어있는 하위 폴더를 기반으로 각 파일에 접미사를 추가하고 싶습니다. 예를 들어 'bej-3-83'이 'T13N_10W'하위 폴더에 저장되어있는 경우 내 R 스크립트의 이름을 'bej-3-83'으로 'bej-3-83-T13N_10W'로 변경하고 그 안에 저장된 각 파일에 대해 각 하위 폴더.디렉터리 내의 하위 폴더 이름을 기반으로 파일 이름에 접미사 추가 R

내가 부분적으로 내가이 스크립트를 사용하여 원하는 것보다 더 수동 입력 여전히이기는하지만이 과정을 수행 할 수 있습니다이 스크립트를 볼 수

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)) 
}) 

을하지만은 ISN 하위 폴더 이름을 수동으로 붙여 입력을 사용 하나의 스크립트에서 필요한 것을 수행하는 스크립트를 만들려고 할 때 유용합니다.

'pushd'와 'popd'를 사용하는 비슷한 질문과 답변이 있는데 링크로 아래 스레드에 첨부했습니다. 내가 할 수있는만큼이 기능들을 읽을려고 노력하고 있지만, 지금까지는 그것을 작동시키는 과정이 멈춰있다. 감사합니다

Rename Files Based On Folder Name

How to rename files in folders to foldername using batch file

,

헨리

답변

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))) 
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) 
    } 

    }  
}