长话短说,我有一个有缺陷的 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