Я пытаюсь получить даты создания файлов из R и понимаю, что эту информацию вообще невозможно получить в некоторых операционных системах, которые просто нигде не хранят ее. Однако я не уверен, как получить его в общем случае, если он (по крайней мере, теоретически) извлекаемый.

В Windows это просто, потому что ctime из file.info предоставляет эту информацию для справки, это соответствующий отрывок из ?file.info

То, что подразумевается под временем трех файлов, зависит от ОС и файловой системы. В собственных файловых системах Windows ctime - это время создания файла (то, что не записывается в большинстве файловых систем, подобных Unix).

Однако, хотя большинство систем unix не записывают эту информацию (как указано в справке), некоторые системы на основе unix, такие как OS X, на самом деле хранят ее. В OS X, например, метаданные системной команды ls mdls будут печатать метаданные файла и перечислять kMDItemContentCreationDate (фактическую дату создания файла) в качестве одного из атрибутов файла.

Мой вопрос в том, что люди могут посоветовать, чтобы узнать даты создания файлов (если они вообще доступны) из метаданных файлов? (например, особенно в случае OS X, где есть системная команда, но нет прямого вызова R)

ОБНОВЛЕНИЕ :

Благодаря информации из комментариев + подробности о SO и SE здесь и здесь, я придумал способ решить эту проблему в R на платформах unix типа OS X, которые отслеживают дату создания и имеют stat команда в стиле BSD. Однако я все еще не мог понять, как это сделать в R в других системах Linux, которые отслеживают дату создания, но не имеют этой версии stat. В этом ответе на unix SE предлагается получить эту информацию. с debugfs + stat, даже когда сам stat не сообщает об этом (при условии, что файловая система записывает дату рождения), но это решение, которое я не мог заставить работать (только Linux, на котором я мог тестировать, не имел debugfs). В любом случае, вот как далеко я продвинулся:

get_birthdate <- function(filepath) {
  switch(Sys.info()[['sysname']],
         Windows = {
           # Windows
           file.info(filepath)$ctime
         },
         Darwin = {
           # OS X
           cmd <- paste('stat -f "%DB"', filepath) # use BSD stat command
           ctime_sec <- as.integer(system(cmd, intern=T)) # retrieve birth date in seconds from start of epoch (%DB)
           as.POSIXct(ctime_sec, origin = "1970-01-01", tz = "") # convert to POSIXct
         },
         Linux  = {
           # Linux
           stop("not sure how to do this")
         })
}
3
sebkopf 27 Апр 2014 в 06:25

1 ответ

Я знаю, что немного опоздал в игру, но вот довольно простое решение для unix / Mac OS:

file.name <- "~/dir/file.extension"
df$file_created_dt <- system(paste0("stat -f %SB ", file.name), intern = T)

А затем вы можете отформатировать его как хотите:

df$file_created_dt <- as.POSIXct(df$file_created_dt, format = "%b %d %H:%M:%S %Y", origin = "1970-01-01 00:00:00", tz = "your/timezone")
-1
doc_owl 26 Окт 2017 в 01:07