在多个文件的创建日期上设置属性

Setting the attribute on the creation date of multiple files

有人可以帮我完成以下任务吗?我有很多从一个相当不寻常的控制系统中“提取”的小文本文件。当我传输文件时,我只收到文件的内容。不幸的是,我就这样失去了所有的属性。而我最关心的是创作日期。我设法(使用相机和 OCR 程序)实现了这样一个事实,即我已经有了一个包含文件名称和正确创建日期的 table。如下:

library(tidyverse)
library(lubridate)

df = tibble(
  Name = c("name1.mpf", "name2.mpf", "name3.mpf", "name4.mpf", "name5.mpf"),
  Date = c("12/04/1997", "04/06/1998", "21/08/1998", "22/08/1998", "05/09/1999")
)

df = df %>% mutate(Date = dmy(Date))

不幸的是,我不知道如何在 R 中设置这些文件的创建日期。我是 R 的初学者。 任何建议将不胜感激。

我有几百个文件。

请尝试以下操作:

library(tidyverse)
library(lubridate)
library(tidyr)

df %>% 
  mutate(Date = dmy(Date))  %>% 
  mutate(Name = replace(Name, T, str_remove(Name,".mpf"))) %>% 
  unite("Filename",Name, Date) %>% 
  mutate(Filename=paste0(Filename,".mpf"))

这样做。首先在 RStudio 中创建一个项目(我假设您现在正在使用 RStudio),然后在项目目录中创建一个新文件夹,简称为 Folder。然后将您的文件放在那里您要设置日期。 最后,使用文件的名称和日期制作一个名为 dftibble

library(tidyverse)
library(lubridate)
library(fs)

df = tibble(
  fileName = c("name1.mpf", "name2.mpf", "name3.mpf", "name4.mpf", "name5.mpf"),
  fileDate = c("12/04/1997", "04/06/1998", "21/08/1998", "22/08/1998", "05/09/1999")
)

df = df %>% mutate(fileDate = dmy(fileDate))

现在您需要两个额外的功能。如果您不了解所有内容,请不要担心。这些功能已经过验证和测试,因此可以正常工作。

fGetInfo = function(file) file %>% file.info() %>% as_tibble()
fsetFileTime = function(data){ 
  data %>% mutate(
    result = case_when(
      is.na(fileDate) ~ "Missing date",
      !file_exists(file) ~ "File dont exist",
      TRUE ~ tryCatch(
        {
          res = "Error"
          if(Sys.setFileTime(file, fileDate)) res = "Date changed"
          res
        }, error = function(msg) res
      )
    )
  )
}

是时候使用第一个读取文件属性了。

dffiles = tibble(
  file = dir_ls("Folder", regexp = "."),
  fileName = file %>% path_file(),
  id = 1:length(file)
) %>% 
  mutate(info = map(file, fGetInfo)) %>% 
  unnest(info)
dffiles

输出

# A tibble: 7 x 10
  file             fileName     id  size isdir mode      mtime               ctime               atime               exe  
  <fs::path>       <chr>     <int> <dbl> <lgl> <octmode> <dttm>              <dttm>              <dttm>              <chr>
1 Folder/name1.mpf name1.mpf     1   452 FALSE 666       2021-08-03 02:00:00 2021-10-20 19:19:55 2021-10-20 19:19:55 no   
2 Folder/name2.mpf name2.mpf     2   452 FALSE 666       2021-08-03 02:00:00 2021-10-20 19:20:30 2021-10-20 19:20:30 no   
3 Folder/name3.mpf name3.mpf     3   452 FALSE 666       2021-08-03 02:00:00 2021-10-20 19:20:29 2021-10-20 19:20:29 no   
4 Folder/name4.mpf name4.mpf     4   452 FALSE 666       2021-08-03 02:00:00 2021-10-20 19:20:33 2021-10-20 19:20:33 no   
5 Folder/name5.mpf name5.mpf     5   452 FALSE 666       2021-08-03 02:00:00 2021-10-20 19:20:32 2021-10-20 19:20:32 no   
6 Folder/name6.mpf name6.mpf     6   452 FALSE 666       2021-08-03 02:00:00 2021-10-20 19:20:32 2021-10-20 19:20:32 no   
7 Folder/name7.mpf name7.mpf     7   452 FALSE 666       2021-08-03 02:00:00 2021-10-20 19:20:31 2021-10-20 19:20:31 no   

如您所见,我的文件夹中有 7 个文件(故意比 df 中的多),它们都有今天的日期。 现在我们需要加入 tibbles dffilesdf.

dffiles = dffiles %>% left_join(df, by="fileName") 
dffiles%>% 
  select(c(file, fileName, fileDate))

输出

# A tibble: 7 x 3
  file             fileName  fileDate  
  <fs::path>       <chr>     <date>    
1 Folder/name1.mpf name1.mpf 2021-08-03
2 Folder/name2.mpf name2.mpf 2021-08-03
3 Folder/name3.mpf name3.mpf 2021-08-03
4 Folder/name4.mpf name4.mpf 2021-08-03
5 Folder/name5.mpf name5.mpf 2021-08-03
6 Folder/name6.mpf name6.mpf NA        
7 Folder/name7.mpf name7.mpf NA  

最后,除了为适当的文件设置日期外别无他法。

dffiles = dffiles %>% group_by(id) %>% 
  nest(data=c(file, fileDate)) %>% 
  mutate(data = map(data, ~fsetFileTime(.x))) %>% 
  unnest(data) %>% 
  mutate(result = result %>% factor()) 
dffiles %>% 
  select(c(file, fileName, fileDate, result))

输出

Adding missing grouping variables: `id`
# A tibble: 7 x 5
# Groups:   id [7]
     id file             fileName  fileDate   result      
  <int> <fs::path>       <chr>     <date>     <fct>       
1     1 Folder/name1.mpf name1.mpf 1997-04-12 Date changed
2     2 Folder/name2.mpf name2.mpf 1998-06-04 Date changed
3     3 Folder/name3.mpf name3.mpf 1998-08-21 Date changed
4     4 Folder/name4.mpf name4.mpf 1998-08-22 Date changed
5     5 Folder/name5.mpf name5.mpf 1999-09-05 Date changed
6     6 Folder/name6.mpf name6.mpf NA         Missing date
7     7 Folder/name7.mpf name7.mpf NA         Missing date

如您所见,一切顺利!

祝您更改所有文件的日期,无论您有多少文件!