在多个文件的创建日期上设置属性
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。然后将您的文件放在那里您要设置日期。
最后,使用文件的名称和日期制作一个名为 df
的 tibble
。
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 中的多),它们都有今天的日期。
现在我们需要加入 tibble
s dffiles
和 df
.
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
如您所见,一切顺利!
祝您更改所有文件的日期,无论您有多少文件!
有人可以帮我完成以下任务吗?我有很多从一个相当不寻常的控制系统中“提取”的小文本文件。当我传输文件时,我只收到文件的内容。不幸的是,我就这样失去了所有的属性。而我最关心的是创作日期。我设法(使用相机和 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。然后将您的文件放在那里您要设置日期。
最后,使用文件的名称和日期制作一个名为 df
的 tibble
。
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 中的多),它们都有今天的日期。
现在我们需要加入 tibble
s dffiles
和 df
.
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
如您所见,一切顺利!
祝您更改所有文件的日期,无论您有多少文件!