我可以编写文件重新创建脚本,使其 inodes/mtimes 按文件名顺序增加吗?跨子目录?

我可以编写文件重新创建脚本,使其 inodes/mtimes 按文件名顺序增加吗?跨子目录?

长话短说,我有一个有缺陷的 Makefile,它缺少一些先决条件定义,因此意外地依赖于磁盘上文件的“顺序”(从 SVN 存储库中检出),如其 inode 编号所示。*

这个顺序似乎在 SVN 服务器迁移后发生了变化(而且,公平地说,这个顺序并不是有人会故意依赖的)。但结果是我的构建被破坏了,因为过去首先构建的目标(并触发了先决条件的构建)现在是在其他目标(错误地缺少该先决条件)之后构建的。

我可以修复 Makefile,但作为重建旧版本软件(仍然包含 Makefile bug)的解决方法,我想要一个命令或小脚本来:

  • 按文件名升序重新创建文件和目录
  • 递归地跨子目录
  • 所以最终结果是索引节点随着文件名的增加而增加

这可能吗?

Bash 是理想选择,但 Python 也可以接受。

* 我实际上不知道 Make 正在访问 inode 编号中的文件,但它绝对不是按字母文件名顺序执行的。这可能是修改时间,但如果是这样,那么问题是一样的。如果顺序是完全随机的,那么这个问题就毫无意义了。 (我意识到这很可能是指定的是任意的,但可以使用它)。

答案1

按照您希望设置修改时间的顺序为该脚本提供文件名列表。它们将按升序设置,间隔 1 秒。

#!/bin/sh
# touch++: run touch to set mod time of file arguments,
# starting at indicated time and increasing by 1 second
# for each argument
# mp, 5/2/2018
usage() {
    echo "Usage: $0 -d \"date\" FILE ..." >&2
}

while getopts "d:" opt
do
    case "$opt" in
        d)
            date="$OPTARG"
            ;;
        *)
            usage
            exit 1
            ;;
    esac
done
shift $((OPTIND-1))

if [ -z "$date" ]
then
    usage
    exit 1
fi
secs=$(date -d "$date" "+%s")
if [ $? != 0 ]
then
    usage
    exit 2
fi
echo setting times starting at $secs $(date -d "@$secs")
for f
do
    touch -m -t $(date -d "@$secs" "+%Y%m%d%H%M.%S") -- "$f"
    secs=$((secs + 1))
done

相关内容