파일 이름 순서에서 inode/mtimes가 증가하도록 파일 재생성 스크립트를 작성할 수 있습니까? 하위 디렉터리 전반에 걸쳐?

파일 이름 순서에서 inode/mtimes가 증가하도록 파일 재생성 스크립트를 작성할 수 있습니까? 하위 디렉터리 전반에 걸쳐?

간단히 말해서, 일부 필수 정의가 누락되어 예기치 않게 inode 번호로 표시된 디스크(SVN 저장소에서 체크아웃)에 있는 파일의 "순서"에 의존하는 결함 있는 Makefile이 있습니다. *

이 순서는 SVN 서버 마이그레이션 이후에 변경된 것으로 보입니다(공정하게 말하면 누구도 의도적으로 의존하는 순서는 아닙니다). 그러나 결과적으로 내 빌드가 손상되었습니다. 먼저 빌드하는 데 사용된(그리고 필수 구성 요소의 빌드를 트리거한) 대상이 이제 다른 대상(해당 필수 구성 요소가 잘못 누락됨) 이후에 빌드되기 때문입니다.

Makefile을 수정할 수 있지만 이전 버전의 소프트웨어(여전히 Makefile 버그가 포함되어 있음)를 다시 빌드하기 위한 해결 방법으로 다음과 같은 명령이나 작은 스크립트를 사용하고 싶습니다.

  • 파일 이름의 오름차순으로 파일과 디렉터리를 다시 만듭니다.
  • 하위 디렉터리에 걸쳐 재귀적으로
  • 따라서 최종 결과는 파일 이름이 증가함에 따라 inode가 증가한다는 것입니다.

가능합니까?

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

관련 정보