9

在 Mac OS 中更改文件夹(以及递归包含的项目)的创建和最后修改日期的最简单方法是什么?

4

6 回答 6

18

我不确定这是小牛队的问题还是什么,但touch -mt或者touch -t只是更新修改后的时间和上次打开的时间。

也许touch -mtORtouch -t命令适用于 10.8.4 及更早版本。

对于小牛队,我找到了如下解决方案。

SetFile -d '12/31/1999 23:59:59' file.txt
            MM dd yyyy hh mm ss  fileName

要更新文件夹中的所有文件,只需使用

SetFile -d '12/31/1999 23:59:59' *

参考

于 2014-03-21T22:28:55.673 回答
10

我相信以下查找/触摸应该有效:

find /target/dir -exec touch '{}' \;

来自man touch

touch -- change file access and modification times
于 2013-08-03T08:26:29.590 回答
8

最简单的方法是使用终端

// to change the creation date
touch -mt 201308030000 [pathtofile][filename]

// to change the modified date
touch -t 201308030000 [pathtofile][filename]

日期/时间字符串是这样构建的:

  • 年份YYYY
  • MM
  • 第一
  • 小时_
  • 分钟毫米

编辑

对于递归部分,请使用anubhava 在他的回答中建议的内容:

find [path] -exec touch -t 201308030000 {} \;
于 2013-08-03T08:27:01.560 回答
2

对于那些没有安装 XCode 或开发者工具而无法使用的人SetFile,见下文

  1. touch -m abc.txt设置当前时间为 abc.txt 的修改时间
  2. touch -mt YYYYMMDDhhmm abc.txt设置 YYYYMMDDhhmm 为 abc.txt 的修改时间
  3. touch -t YYYYMMDDhhmm abc.txt将 YYYYMMDDhhmm 设置为 abc.txt 的访问时间和修改时间
  4. 更重要的是,touch命令并非旨在更改文件创建时间。看来,创建时间不是 UNIX 的概念。touch用于更改文件访问和修改时间。参见手册touch

那么为什么touch只更改创建时间几次呢?原因是修改时间不能小于创建时间。因此,当我们将修改时间设置为创建时间之前的日期时,创建时间也设置为修改时间。现在有两件事。

  1. touch -t比创建时间更早的日期,将创建和修改时间都设置为更早的日期。
  2. touch -t比创建时间更新的日期,仅将修改时间设置为更新的日期。创建时间将不受影响。可以达到最佳创建时间cp oldfile newfile,因此将newfile当前时间作为创建时间,然后可以再次减少touch -t

SetFile适用于任何日期。如果它不用PATH
xcrun SetFile -d '12/31/2099 23:59:59' abc.txt

于 2014-11-28T06:06:19.053 回答
2

从终端:

a) 创建日期:

touch –t YYYYMMDDhhmm theFile

b) 修改日期:

touch –mt YYYYMMDDhhmm the File

例子:

touch –t 201308021025 theFile.txt
touch –mt 201308021026 theFile.txt

如果您需要对一组文件执行操作,请使用 find & xargs

于 2013-08-03T08:28:55.237 回答
0

在 27 英寸 iMac(2019 年末型号)上运行的最新 macOS Big Sur 11.0.1 中,通过命令“ls -lt”和“ls -ltr”列出的目录完全相同,而不是相反。

所以我决定使用命令“stat”来生成与修改日期相对应的整数,而不是使用不可靠的“ls”命令(如果我错了,请纠正我)。我在主目录的 .bashrc 配置文件中创建了以下非递归函数作为别名“moddate”,随时可以在任何目录列表上执行,如:“moddate *”用于当前目录中的所有文件夹。注意只有文件夹在这里有意义,而不是文件。

### Update parent folder's modification date taken from the newest child folder nested within.
    
function moddate {

    dir_list=$@

    for path in $dir_list
    do
        if [[ -d "${path}" ]]; then
            latest=`stat -f '%m %N' ${path}/* | sort -k1rn | awk '{print $2; exit}'`
            ls -ld $latest
            (set -x; touch -r "${latest}" "${path}")
        fi
    done
}
于 2020-12-14T14:49:29.943 回答