file.rename deletes files if filename format is <0-9>.R

Description

This issue appears to apply to vectorised and loop approaches to renaming several files. Vectorised approach used in reprex below. The bug only seems to present when filenames do not contain meaningful or alphanumeric strings.

Summary

Existing files prior to file.rename:
"1.R" "2.R" "3.R" "4.R" "5.R".
Existing files following file.rename:
"6.R".
Expected output:
"2.R" "3.R" "4.R" "5.R" "6.R"

Reprex

library(stringr)
# how many files to create
req_nos <- c(1:5)
# create file names
req_names <- paste(req_nos, "R", sep = ".")
# create the files
invisible(file.create(req_names))
# adjust the numbering plus 1
new_nos <- as.character(req_nos + 1)
# create new names with the new numbering
new_names <- str_replace(req_names, "^[0-9]*", new_nos)
# file.rename loses the files up to the largest value of new_nos
file.rename(from = req_names, to = new_names)

devtools::session_info
─ Session info


setting value
version R version 4.0.4 (2021-02-15)
os macOS Catalina 10.15.7
system x86_64, darwin17.0
ui RStudio
language (EN)
collate en_GB.UTF-8
ctype en_GB.UTF-8
tz Europe/London
date 2021-03-20

─ Packages


package * version date lib source
assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.0.0)
audio 0.1-7 2020-03-09 [1] CRAN (R 4.0.2)
beepr 1.3 2018-06-04 [1] CRAN (R 4.0.2)
callr 3.5.1 2020-10-13 [1] CRAN (R 4.0.2)
cli 2.3.1 2021-02-23 [1] CRAN (R 4.0.1)
crayon 1.4.1 2021-02-08 [1] CRAN (R 4.0.2)
desc 1.2.0 2018-05-01 [1] CRAN (R 4.0.0)
devtools 2.3.2 2020-09-18 [1] CRAN (R 4.0.2)
digest 0.6.27 2020-10-24 [1] CRAN (R 4.0.2)
ellipsis 0.3.1 2020-05-15 [1] CRAN (R 4.0.0)
fs 1.5.0 2020-07-31 [1] CRAN (R 4.0.2)
glue 1.4.2 2020-08-27 [1] CRAN (R 4.0.2)
log4r 0.3.2 2020-01-18 [1] CRAN (R 4.0.2)
magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.0.2)
memoise 1.1.0 2017-04-21 [1] CRAN (R 4.0.2)
pkgbuild 1.2.0 2020-12-15 [1] CRAN (R 4.0.2)
pkgload 1.1.0 2020-05-29 [1] CRAN (R 4.0.2)
prettyunits 1.1.1 2020-01-24 [1] CRAN (R 4.0.0)
processx 3.4.5 2020-11-30 [1] CRAN (R 4.0.2)
ps 1.5.0 2020-12-05 [1] CRAN (R 4.0.2)
R6 2.5.0 2020-10-28 [1] CRAN (R 4.0.2)
remotes 2.2.0 2020-07-21 [1] CRAN (R 4.0.2)
rlang 0.4.10 2020-12-30 [1] CRAN (R 4.0.2)
rprojroot 2.0.2 2020-11-15 [1] CRAN (R 4.0.2)
sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.0.2)
stringi 1.5.3 2020-09-09 [1] CRAN (R 4.0.2)
stringr * 1.4.0 2019-02-10 [1] CRAN (R 4.0.0)
testthat 3.0.2 2021-02-14 [1] CRAN (R 4.0.2)
tinytex 0.23 2020-05-19 [1] CRAN (R 4.0.0)
usethis 1.6.3 2020-09-17 [1] CRAN (R 4.0.2)
withr 2.4.1 2021-01-26 [1] CRAN (R 4.0.2)
xfun 0.21 2021-02-10 [1] CRAN (R 4.0.2)
yaml 2.2.1 2020-02-01 [1] CRAN (R 4.0.0)

If you rename 1 to 2 then rename 2 to 3 then you have effectively renamed 1 to 3.
Probably reversing order of renames would work
Rename 5 to 6 then rename 4 to 5 etc

1 Like

As in @nirgrahamuk's suggestion, the following resolves the issue:

library(stringr)
# how many files to create: REVERSE the sequence
req_nos <- order(-c(1:5))
# create file names
req_names <- paste(req_nos, "R", sep = ".")
# create the files
invisible(file.create(req_names))
# adjust the numbering plus 1
new_nos <- as.character(req_nos + 1)
# create new names with the new numbering
new_names <- str_replace(req_names, "^[0-9]*", new_nos)
# file.rename loses the files up to the largest value of new_nos
file.rename(from = req_names, to = new_names)

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.