将多个文件夹的修改日期更改为它们最近修改的文件的日期

3
我一直在使用以下的shell bin/bash脚本作为应用程序,我可以把文件夹拖放到上面,它会更新该文件夹的修改日期以匹配其中最近修改的文件。
for f in each "$@"
do
    echo "$f"
done
$HOME/setMod "$@"

这将获取文件夹名称,然后将其传递给我主目录中的setMod脚本。
#!/bin/bash
# Check that exactly one parameter has been specified - the directory
if [ $# -eq 1 ]; then
   # Go to that directory or give up and die
   cd "$1" || exit 1
   # Get name of newest file
   newest=$(stat -f "%m:%N" * | sort -rn | head -1 | cut -f2 -d:)
   # Set modification date of folder to match
   touch -r "$newest" .
fi

然而,如果我一次拖放多个文件夹,它将无法工作,我不知道如何让它支持同时处理多个文件夹。

此外,我从苹果客服那里得知,许多文件夹的修改日期不断更新的原因是由于某些与Time Machine相关的进程,尽管我有些文件夹多年未打开。如果有人知道如何防止这种情况发生,或者通过某种方式定期自动更新文件夹的修改日期,以匹配其中最近修改文件的日期/时间,那将使我免于经常手动运行此步骤的麻烦。

1个回答

1

setMod脚本目前只接受一个参数。你可以让它接受多个参数并循环遍历,或者让调用脚本使用循环。

我选择第二个选项,因为调用脚本存在一些错误和弱点。这里对其进行了修正和扩展以适应您的需求:

for dir; do
    echo "$dir"
    "$HOME"/setMod "$dir"
done

或者让setMod接受多个参数:

#!/bin/bash

setMod() {
   cd "$1" || return 1
   # Get name of newest file
   newest=$(stat -f "%m:%N" * | sort -rn | head -1 | cut -f2 -d:)
   # Set modification date of folder to match
   touch -r "$newest" .
}

for dir; do
   if [ ! -d "$dir" ]; then
       echo not a directory, skipping: $dir
       continue
   fi

   (setMod "$dir")
done

注:

  • for dir; do 相当于 for dir in "$@"; do
  • (setMod "$dir") 周围加括号使其在子shell中运行,这样脚本本身不会改变工作目录,cd 操作的影响仅限于 (...) 中的子shell。

太棒了!我喜欢这个社区!那个运行得非常好。谢谢你,先生! - Max Well
有没有办法修改这个程序,使其递归运行,深入到我放在应用程序上的任何文件夹的最低级子文件夹,修复每个文件夹的修改日期,然后向上工作到顶层文件夹?此外,这个脚本会忽略.DS_Store文件吗?这些文件是由操作系统更新的,也会导致文件夹的修改日期被更新。我希望有一种简单的方法来防止这种情况发生。再次感谢! - Max Well
嗨@MaxWell - 我在iCloud重置所有文件夹日期后遇到了这个问题。以下是我的Python脚本,尽我最大努力(忽略.DS_Store,忽略空文件夹,否则从文件中获取日期,向上传递)。在正常使用中,文件夹实际上只有在创建或删除子文件/文件夹时才会更改修改日期,因此我尝试了一种基于ctime的方案。但是我更喜欢我的需求的mtime。现有文件夹的ctime始终倾向于过旧,因为没有记录已删除的内容。 https://gist.github.com/robince/02f7613511b27279f9d661971ff880b7 - robince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接