【问题标题】:How to rename mutliples files in r如何在r中重命名多个文件
【发布时间】:2020-01-03 18:59:48
【问题描述】:

我需要将 100 多个图像名称转换为如下格式:SITE_T001_L001.jpg,其中 Site 为 CGS1,T= TUBES,L= 图像编号。

所有这些图像都包含在一个名为 CGS1(站点)的文件中,并根据其管号按文件进行细分。然后图像按日期组织。此顺序代表图像编号。第一个是1,第二个是2。(字母顺序不正确)

在这里,我有一个图形表示: 我发现如何在 R

中手动完成
file.rename("Snap_029.jpg",
        paste("CGS1","T001","L003", ".jpg", sep = "_"))

但是有没有办法通过循环来自动化它?

更详细的信息 - 根据回复中的要求: 我有这一系列输入文件名(包括前导路径)- 按修改日期排序(重要)。

file_list
[1] "CGS1/1/Snap_001.jpg" "CGS1/1/Snap_002.jpg" "CGS1/1/Snap_005.jpg" "CGS1/2/Snap_006.jpg" "CGS1/2/Snap_007.jpg" "CGS1/2/Snap_082.jpg"

我希望修改主文件夹 CGS1、从 T001 到 T002 的子文件夹以及从 L001 到 L003 的修改日期之后的每个图像的名称作为输出文件名

new_file_list
 [1] "CGS1_T001_L001.jpg" "CGS1_T001_L002.jpg" "CGS1_T001_L003.jpg" "CGS1_T002_L001.jpg" "CGS1_T002_L002.jpg" "CGS1_T002_L003.jpg"

【问题讨论】:

  • 尝试 cding 进入包含文件的目录,list.files*apply/map* 并在其中添加 file.rename
  • 谢谢尼尔森。看起来很有趣,但我很难跟着你。你能给我更多的细节吗?

标签: r loops rename


【解决方案1】:

试试这个:

file_list <- list.files(path = "...", recursive = TRUE, pattern = "\\.jpg$")
### for testing
file_list <- c(
  "CGS1/1/Snap_001.jpg", "CGS1/1/Snap_005.jpg", "CGS1/1/Snap_002.jpg",
  "CGS1/2/Snap_006.jpg", "CGS1/2/Snap_007.jpg", "CGS1/2/Snap_0082.jpg"
)

spl <- strsplit(file_list, "[/\\\\]")
# ensure that all files are exactly two levels down
stopifnot(all(lengths(spl) == 3))

m <- do.call(rbind, spl)
m
#      [,1]   [,2] [,3]           
# [1,] "CGS1" "1"  "Snap_001.jpg" 
# [2,] "CGS1" "1"  "Snap_005.jpg" 
# [3,] "CGS1" "1"  "Snap_002.jpg" 
# [4,] "CGS1" "2"  "Snap_006.jpg" 
# [5,] "CGS1" "2"  "Snap_007.jpg" 
# [6,] "CGS1" "2"  "Snap_0082.jpg"

据此,我们会将第二/第三列更新为您所期望的。

# either one (not both), depending on if you are guaranteed integers
m[,2] <- sprintf("T%03.0f", as.integer(m[,2]))
# ... or if you may have non-numbers
m[,2] <- paste0("T", strrep("0", max(0, 3 - nchar(m[,2]))), m[,2])

# since we really don't care about 'Snap_001.jpg' (etc), we can discard the third column
new_file_list <- apply(m[,1:2], 1, paste, collapse = "_")
# back-street way of applying sequences to each CGS/T combination while preserving order
for (prefix in unique(new_file_list)) {
  new_file_list[new_file_list == prefix] <- sprintf("%s_L%03d.jpg",
                                                    new_file_list[new_file_list == prefix],
                                                    seq_len(sum(new_file_list == prefix)))
}
new_file_list
# [1] "CGS1_T001_L001.jpg" "CGS1_T001_L002.jpg" "CGS1_T001_L003.jpg"
# [4] "CGS1_T002_L001.jpg" "CGS1_T002_L002.jpg" "CGS1_T002_L003.jpg"

现在是重命名的问题。请注意,这会将所有文件移动到当前目录中。

file.rename(file_list, new_file_list)

【讨论】:

  • 太棒了!谢谢!
  • 一切正常,除了重命名文件。它发送 FALSE。我不知道为什么-有人吗?
  • 文件权限?文件“忙”?目标目录权限?目标文件存在吗?
  • 图片编号重命名有一个小问题。考虑到管号,是否可以重命名它们?例如,在我的示例中,我们将有:CGS1_T001_L001.jpg、CGS1_T001_L002.jpg、CGS1_T001_L003.jpg、CGS1_T002_L001.jpg、CGS1_T002_L002.jpg、CGS1_T002_L003.jpg。在我的每个管文件中,我都有完全相同数量的图像。
  • 成功了!只需要小心地让文件按时间排序,而不是从一开始就按名称排序!非常感谢 - 太好了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多