2017-11-29 14 views
0

ディレクトリフォルダ内に多数の(サブ)フォルダが格納されています。各サブフォルダには、飛行機の名前と番号(例:bej-3-83)で名前が付けられた5-35の.jpg航空写真ファイルが含まれています。私は、これらのファイルのそれぞれに格納されているサブフォルダに基づいてサフィックスを追加したいと思います。たとえば、 '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サブフォルダ名のマニュアルペースト入力を使用して見ることができるように私が1つで必要なものを実行するスクリプトを作成しようとしているときに役に立ちません。

「pushd」と「popd」を利用した同様の質問と回答があります。リンクとしてこれらのスレッドに添付しました。私はこれらの機能についてできるだけ多くのことを読むように努めていますが、今のところそれを動作させるプロセスは私にはまっています。敬具

How to rename files in folders to foldername using batch file

Rename Files Based On Folder Name

ヘンリー

答えて

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

    }  
} 
関連する問題