Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 根据MacOS文件夹中的文件名更改创建和修改文件的日期和时间_Bash_Macos_Date_Time_Touch - Fatal编程技术网

Bash 根据MacOS文件夹中的文件名更改创建和修改文件的日期和时间

Bash 根据MacOS文件夹中的文件名更改创建和修改文件的日期和时间,bash,macos,date,time,touch,Bash,Macos,Date,Time,Touch,我在文件夹中有很多文件,文件名如下 20190618_213557.mp4 20190620_231105.mp4 20190623_101654.mp4 .. 我需要根据文件名更改创建日期和时间 20190618_213557=YYYYMMDD_HHMMSS 在终端中使用bash脚本阅读以下内容:请注意,此问题和答案适用于Mac OS。在Linux中,大多数情况下没有文件创建时间 touch命令可以更改文件的创建日期。从man touch -t STAMP使用[[CC]YY]MMDDhhm

我在文件夹中有很多文件,文件名如下

20190618_213557.mp4
20190620_231105.mp4
20190623_101654.mp4
..
我需要根据文件名更改创建日期和时间 20190618_213557=YYYYMMDD_HHMMSS
在终端中使用bash脚本阅读以下内容:请注意,此问题和答案适用于Mac OS。在Linux中,大多数情况下没有文件创建时间


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

-t STAMP
使用
[[CC]YY]MMDDhhmm[.ss]
代替当前时间

因此,我们只需将您的格式
YYYYMMDD\u 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
您可能感兴趣的
触摸
更多选项:

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

但是,声称只有在指定日期早于当前创建日期的情况下,才会更改创建日期。如果是这种情况,并且您希望将时间更改为原始创建日期之后的时间,请使用

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
可能必须先安装。

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

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
必须小心使用相同的变量字母作为循环和括号<代码>我在。。。{x:4:2}应该是
,因为我在。。。{i:4:2}
至少在mac上,并在完成之前以分号结束。此代码应适用于:

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

您的命令不会更改文件的“创建时间”。文件没有“创建时间”,只有“访问时间”、“修改时间”和最后一次“inode更改”的时间,甚至最后一次“inode更改”的时间也不能修改。@user1934428虽然您的说法在Linux上可能是正确的,但OP将他们的问题标记为。在Mac OS上,文件有一个创建日期(称为出生日期)并且
touch
(有时)会更改这个日期——请参见答案。我认为没有创建时间的想法在所有Unix风格中都很常见(这个概念就是在这里出现的),而且由于MacOS的核心有BSD,我盲目地认为它也会存在。谢谢你指出这一点!看到我的答案了吗?如果是这样,我们将非常感谢您的支持/接受。如果没有,我很乐意听到问题出在哪里。您可以使用以下方法更改日期:t3=“20120101”t3=$(日期-j-f%Y%m%d-v-1400d$t3+%Y%m%d)echo$t3我的意思是:如何更改kMDItemDateAdded和kMDItemDateAdded\u ranking恐怕不行。互联网上有很多关于这个主题的帖子,但没有人给出更新kMDItemDateAdded的方法。附言:别忘了投票:)