Вот пример:
filenames <- c(
"AAA_dat1.txt", "AAA_dat2.txt", "AAA_dat3.txt",
"BBB_dat1.txt", "BBB_dat2.txt", "BBB_dat3.txt"
)
dirs <- gsub("_.*", "", basename(filenames))
dirs
# [1] "AAA" "AAA" "AAA" "BBB" "BBB" "BBB"
Хотя для этого и нет необходимости создавать data.frame
, это немного упрощает индексирование и просмотр вещей:
moves <- data.frame(
origpath = filenames, # not basename'd
newpath = file.path(dirs, basename(filenames))
)[ !grepl("dat3", basename(filenames)), ]
moves
# origpath newpath
# 1 AAA_dat1.txt AAA/AAA_dat1.txt
# 2 AAA_dat2.txt AAA/AAA_dat2.txt
# 4 BBB_dat1.txt BBB/BBB_dat1.txt
# 5 BBB_dat2.txt BBB/BBB_dat2.txt
Обратите внимание, что там нет файлов dat3
. Цель этого фрейма - переименовать (переместить) файлы, и поскольку мы не перемещаем их, нам не нужно делать что-либо для них в этом контексте.
Мы можемпереместите их всех одним махом:
file.rename(moves$origpath, moves$newpath)
Кстати: использование basename
выше было для обработки ситуации, когда (1) исходные файлы не находятся в текущем каталоге, или(2) вы использовали list.files(..., full.names=TRUE)
(чтобы можно было указать полный путь). Это прекрасно работает, когда все они находятся в текущем каталоге или, если нет, например,
filenames <- c(
"path1/AAA_dat1.txt", "path1/AAA_dat2.txt", "path99/AAA_dat3.txt",
"path2/BBB_dat1.txt", "path1/BBB_dat2.txt", "somepath/BBB_dat3.txt"
)
dirs # derived as above
# [1] "AAA" "AAA" "AAA" "BBB" "BBB" "BBB"
moves # derived as above
# origpath newpath
# 1 path1/AAA_dat1.txt AAA/AAA_dat1.txt
# 2 path1/AAA_dat2.txt AAA/AAA_dat2.txt
# 4 path2/BBB_dat1.txt BBB/BBB_dat1.txt
# 5 path1/BBB_dat2.txt BBB/BBB_dat2.txt