Организация большого количества файлов в папки с помощью R?

Извиняюсь за простоту вопроса, так как я новичок в R.

У меня есть большое количество 1-минутных аудиофайлов, причем 1 минута записывается каждые 5 минут. Мне нужно, чтобы они были организованы по часам и сохранены в новую папку, поэтому каждые 12 файлов нужно сохранять в новую папку. У меня 7472 таких файла, поэтому делать это вручную было бы слишком долго.

Вот пример имен файлов:

20210111_000500.wav,
20210111_001000.wav,
20210111_001500.wav,
20210111_002000.wav,
20210111_002500.wav,
20210111_003000.wav,
20210111_003500.wav,
20210111_004000.wav,
20210111_004500.wav,
20210111_005000.wav,
20210111_005500.wav,

которые я хочу, чтобы все были в одной папке, а следующий час начинался как 20210111_010000.wav и так далее.

Как мне это сделать?

Любая помощь очень ценится, спасибо!


person HarHar    schedule 21.04.2021    source источник
comment
Вам нужно сгруппировать их, а затем скопировать в нужный каталог.   -  person Onyambu    schedule 21.04.2021
comment
Как мне это сделать? Какой будет код? Прости, я не знаю, что делаю.   -  person HarHar    schedule 21.04.2021
comment
Вы сказали, что код ничего не делал. была ли папка с именем my_folder, которая была создана?   -  person Onyambu    schedule 21.04.2021
comment
Также содержит ли nms имена файлов, которые вы хотите переместить?   -  person Onyambu    schedule 21.04.2021
comment
нет, я должен был где-то вводить имена файлов в код?   -  person HarHar    schedule 21.04.2021
comment
Нет, не следует. Это означает, что файлы находятся в определенной папке, а не в рабочем каталоге. попробуй nms <- list.files(path to your folder that contains the wav files, pattern = "\\.wav", full.names = TRUE)   -  person Onyambu    schedule 21.04.2021
comment
В глобальной среде nms говорит символ (пустой), это правильно?   -  person HarHar    schedule 21.04.2021
comment
Нет, это неправильно. Во-первых, где хранятся файлы? Теперь проверьте путь к папке, в которой хранятся файлы, и попробуйте запустить list.files, чтобы убедиться, что nms содержит все файлы, которые вам нужно переупорядочить. попробуйте help(list.files), чтобы понять, как пользоваться функцией   -  person Onyambu    schedule 21.04.2021
comment
Хорошо, теперь nms содержит все элементы. Проблема заключалась в том, что файлы имеют формат .WAV, а не .wav ... Однако моя новая проблема заключается в том, что «группы» по-прежнему представляют собой список из 0   -  person HarHar    schedule 21.04.2021
comment
что вам дает strptime(nms, "%Y%m%d_%H%M%S")?   -  person Onyambu    schedule 21.04.2021
comment
strptime(nms, %Y%m%d_%H%M%S) просто возвращает NA для каждой записи   -  person HarHar    schedule 21.04.2021
comment
Вот в чем проблема. Не могли бы вы попробовать strptime(basename(nms), "%Y%m%d_%H%M%S")   -  person Onyambu    schedule 21.04.2021
comment
Я сделал это, и он сгруппировал все файлы с первого дня по часам. Однако затем я запустил остальную часть кода, и все файлы исчезли. К счастью, я скопировал файлы до того, как начал, поэтому у меня все еще есть их резервные копии.   -  person HarHar    schedule 21.04.2021
comment
Дело не в том, что они исчезли. Проверьте папку с именем my_folder в вашем каталоге. Все файлы должны быть там. Но по отношению к их группировкам   -  person Onyambu    schedule 21.04.2021
comment
Папки с именем my_folder нет, может быть потому, что файлов так много и обработка занимает некоторое время? Также мне нужно изменить код, чтобы учесть разные дни, отраженные в именах файлов?   -  person HarHar    schedule 21.04.2021
comment
Я отредактировал код. Попробуйте   -  person Onyambu    schedule 21.04.2021
comment
Это взяло 12 файлов за первый час каждого дня (всего 312 файлов) и поместило их вместе в одну папку с именем hour_00 внутри my_folder . Я также получаю сообщение об ошибке Error in (function (x, y, folder = "my_folder") : fl is not TRUE In addition: Warning message: In dir.create(folder) : Error in (function (x, y, folder = "my_folder") : fl is not TRUE. Как мне настроить его, чтобы получать отдельную папку для каждого часа каждого дня? Кстати, спасибо за всю вашу помощь и извините за мою некомпетентность.   -  person HarHar    schedule 21.04.2021
comment
ну это шаг. Таким образом, чтобы получать файлы каждый день, вам придется изменить строку groups на groups <- split(nms, format(strptime(nms, "%Y%m%d_%H%M%S"),"%Y%m%d_hour_%H")) вместо нее.   -  person Onyambu    schedule 21.04.2021
comment
проверить правки   -  person Onyambu    schedule 21.04.2021


Ответы (2)


Вы можете попробовать что-то в этом духе. Сначала я нахожу все файлы .wav, затем определяю папки, создаю папки и, наконец, перемещаю файлы .wav в новые папки.

library(tidyverse)

setwd("path_where_wav_files_are_located_goes_here")

# a vector of paths to all .wav files in the specified directory
original_paths <- dir(pattern=".WAV$", full.names = T) %>% str_replace("\\.", getwd())
# only the file names
file_names <- dir(pattern=".WAV$")

# creating a data.frame with original paths and new paths where files are to be moved
df <- tibble(original_paths, file_names) %>%
  mutate(
    folder_name = (row_number() %/% 12 + 1) %>% paste0("_", .), # using integer division so that i have a dedicated folder for each 12 files
    new_path = paste0(getwd(), "/", folder_name, "/", file_names)
  )

# creating the directories
df$folder_name %>%
  unique() %>%
  paste0(getwd(), "/",  .) %>%
  map(
    ~dir.create(.x)
  )

# moving the files
walk2(df$original_paths, df$new_path, ~file.rename(.x, .y))
person Jakub.Novotny    schedule 21.04.2021
comment
Спасибо за вашу помощь, однако при создании каталога я получаю сообщение об ошибке: Warning message: In dir.create(.x) : 'E:\Audiomoth Files\Winter\Rural\Emma' already exists , это моя папка со всеми файлами в ней. Что мне здесь делать? - person HarHar; 21.04.2021
comment
@HarHar Я отредактировал свой ответ, чтобы он учитывал суффикс .WAV, а не .wav. Вы должны проверить, содержат ли векторы/df предполагаемые данные, прежде чем приступить к коду. - person Jakub.Novotny; 21.04.2021

Вы можете сделать что-то в строках:

nms <- list.files(pattern = "\\.wav", full.names = TRUE)
groups <- split(nms, format(strptime(nms, "%Y%m%d_%H%M%S"),"%Y%m%d_hour_%H"))

f <- function(x, y, folder = "my_folder"){
  if(!die.exists(folder)){
      fl <- dir.create(folder)
      stopifnot(fl)
   }
  new_dir <- file.path(folder, y)
  if(!dir.exists(new_dir)) dir.create(new_dir)
  file.copy(x, file.path(new_dir, basename(x)))
  file.remove(x)
}

Map(f, groups, names(groups))
person Onyambu    schedule 21.04.2021
comment
Я запустил этот код, и ничего не происходит? - person HarHar; 21.04.2021