67

1つのフォルダに700を超えるファイルがあり、次の名前が付けられています。番号1から番号9までのファイルは、最初の月の名前が付けられています。

water_200101_01.img  
water_200101_09.img  

10番から30番までのファイルの名前は次のとおりです。

water_200101_10.img
water_200101_30.img

2か月目も同様です。1番から9番までのファイルの名前は次のとおりです。

water_200102_01.img  
water_200102_09.img  

10番から30番までのファイルの名前は次のとおりです。

water_200102_10.img
water_200102_30.img 

ファイルに変更を加えずに名前を変更するにはどうすればよいですか。たとえば、名前を変更するだけです

water_1
water_2
...till...
water_700
4

3 に答える 3

101

file.renamefromファイルの名前を変更し、と名前の両方のベクトルを取ることができtoます。

だから次のようなもの:

file.rename(list.files(pattern="water_*.img"), paste0("water_", 1:700))

動作する可能性があります。

特に順序を気にする場合は、現在存在するファイルのリストを並べ替えるか、特定のパターンに従っている場合は、ファイル名のベクトルを直接作成することができます(ただし、700は30の倍数ではないことに注意してください)。

「どうしてやりたいの?」という質問は脇に置いておきます。ファイル名の情報を捨てているように見えますが、おそらくその情報は他の場所にも含まれていると思われます。

于 2012-05-25T17:45:19.897 に答える
8

私はこれを自分で書いた。高速で、検索と置換で正規表現を使用でき、ファイルサフィックスを無視でき、「試運転」で何が起こるかを示し、既存のファイルの上書きを防ぐことができます。

Macを使用している場合は、applescriptを使用して、Finderの現在のフォルダをターゲットフォルダとして選択できます。

umx_rename_file <- function(findStr = "Finder", replaceStr = NA, baseFolder = "Finder", test = TRUE, ignoreSuffix = TRUE, listPattern = NULL, overwrite = FALSE) {
    umx_check(!is.na(replaceStr), "stop", "Please set a replaceStr to the replacement string you desire.")

    # ==============================
    # = 1. Set folder to search in =
    # ==============================
    if(baseFolder == "Finder"){
        baseFolder = system(intern = TRUE, "osascript -e 'tell application \"Finder\" to get the POSIX path of (target of front window as alias)'")
        message("Using front-most Finder window:", baseFolder)
    } else if(baseFolder == "") {
        baseFolder = paste(dirname(file.choose(new = FALSE)), "/", sep = "") ## choose a directory
        message("Using selected folder:", baseFolder)
    }

    # =================================================
    # = 2. Find files matching listPattern or findStr =
    # =================================================
    a = list.files(baseFolder, pattern = listPattern)
    message("found ", length(a), " possible files")

    changed = 0
    for (fn in a) {
        if(grepl(pattern = findStr, fn, perl= TRUE)){
            if(ignoreSuffix){
                # pull suffix and baseName (without suffix)
                baseName = sub(pattern = "(.*)(\\..*)$", x = fn, replacement = "\\1")
                suffix   = sub(pattern = "(.*)(\\..*)$", x = fn, replacement = "\\2")
                fnew = gsub(findStr, replacement = replaceStr, x = baseName, perl= TRUE) # replace all instances
                fnew = paste0(fnew, suffix)
            } else {
                fnew = gsub(findStr, replacement = replaceStr, x = fn, perl= TRUE) # replace all instances
            }
            if(test){
                message(fn, " would be changed to:  ", omxQuotes(fnew))
            } else {
                if((!overwrite) & file.exists(paste(baseFolder, fnew, sep = ""))){
                    message("renaming ", fn, "to", fnew, "failed as already exists. To overwrite set T")
                } else {
                    file.rename(paste0(baseFolder, fn), paste0(baseFolder, fnew))
                    changed = changed + 1;
                }
            }
        }else{
            if(test){
                # message(paste("bad file",fn))
            }
        }
    }
    if(test & changed==0){
        message("set test = FALSE to actually change files.")
    } else {
        umx_msg(changed)
    }
}
于 2013-09-17T16:58:51.150 に答える
3

特定のパターンに一致するファイル名の特定のセクションを別のパターンに置き換えたい場合。これは、一度に複数のファイルの名前を変更する場合に便利です。たとえば、このコードはfooを含むすべてのファイルを取得し、ファイル名のfooをbobに置き換えます。

file.rename(list.files(pattern = "foo"), str_replace(list.files(pattern = "foo"),pattern = "foo", "bob"))
于 2021-07-16T15:40:35.627 に答える