【问题标题】:Change Date and Time of Creation and Modification of file based on filename in MacOS folder根据 MacOS 文件夹中的文件名更改文件创建和修改的日期和时间
【发布时间】:2019-12-10 19:07:14
【问题描述】:

我的文件夹中有很多文件,其文件名类似于

20190618_213557.mp4
20190620_231105.mp4
20190623_101654.mp4
..

我需要根据文件名更改创建日期和时间 20190618_213557=YYYYMMDD_HHMMSS 在终端中使用 bash 脚本

【问题讨论】:

  • 我的回答对你有用吗?如果是这样,将不胜感激赞成/接受。如果没有,我很乐意听到问题所在。

标签: bash macos date time touch


【解决方案1】:

致阅读本文的旁观者:请注意,此问题和答案适用于 Mac OS。在 Linux 中,大多数情况下没有文件创建时间。


touch 命令可以更改文件的创建日期。来自man touch

-t STAMP 使用[[CC]YY]MMDDhhmm[.ss] 而不是当前时间

所以我们只需要将您的格式YYYYMMDD_hhmmss 转换为touch 的格式。这可以通过bash 的参数替换来完成。我们提取子字符串YYYYMMDD (${x:0:8})、hhmm (${x:9:4}) 和ss (${x:13:2}) 并将它们放在一起。

for i in *.mp4; do
    touch -t "${x:0:8}${x:9:4}.${x:13:2}" "$i"
done

您可能感兴趣的touch 的更多选项:

-c如果文件不存在则不创建。
-a[仅]更改文件的访问时间。
-m[仅]更改文件的修改时间.

但是,this answer 声称,如果指定日期早于当前创建日期,这只会更改创建日期。如果是这种情况,并且您想将时间更改为原始创建日期之后的某个时间,请使用 ...

for i in *.mp4; do
   SetFile -d "${x:4:2}/${x:6:2}/${x:0:4} ${x:9:2}:${x:11:2}:${x:13:2}" "$i"
done

SetFile 可能必须先安装。

【讨论】:

  • 您的命令不会更改文件的“创建时间”。一个文件没有“创建时间”,只有“访问时间”、“修改时间”和最后一次“inode change”的时间,甚至后者也不能修改。
  • @user1934428 虽然您的说法在 Linux 上可能是正确的,但 OP 将他们的问题标记为 macos。在 Mac OS 上,文件有一个创建日期(称为 birth),touch(有时)会更改此日期 -- 请参阅this question 的答案。
  • 我认为没有创建时间的想法是所有 Unix 风格的共同点(这个概念出现的地方),并且由于 MacOS 的核心是 BSD,我盲目地认为它会是一样的。感谢您指出这一点!
【解决方案2】:
MACOS Uses touch -mt to change file creation/modification time. Here is the script:

    #!/bin/bash
    FILES="/Users/shakirzareen/Desktop/untitledfolder/*"
    for f in $FILES         ## f = full path + filename
    do
        t="${f##*/}"            ##remove folder path from filename
        t2="${t//_}"            ##remove _ from filename
        t3="${t2%%.*}"          ##remove file extension part
        touch -mt "$t3" $f  ##set creation and modification time of file
    done

【讨论】:

  • 您可以使用以下方法更改日期:t3="20120101" t3=$(date -j -f %Y%m%d -v-1400d $t3 +%Y%m%d ) 回声 $t3
  • 我的意思是:如何更改 kMDItemDateAdded 和 kMDItemDateAdded_Ranking
  • 恐怕不行。互联网上有许多关于此主题的帖子,但没有人提供更新 kMDItemDateAdded 的方法。 apple.stackexchange.com/questions/176006/… P.S: 别忘了点赞 :)
【解决方案3】:

我在尝试从文件名设置日期时遇到了同样的问题,并且在此处建议的代码上遇到了很多困难。

必须小心在循环和括号中使用相同的变量字母! for i in... {x:4:2} 至少在 mac 上应该是 for i in... {i:4:2} 并在完成之前以分号结束。这段代码应该可以工作:

for i in *.mp4; do
   SetFile -d "${i:4:2}/${i:6:2}/${i:0:4} ${i:9:2}:${i:11:2}:${i:13:2}" "$i";
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 2022-01-20
    • 2011-11-02
    相关资源
    最近更新 更多