간단히 말해서, 일부 필수 정의가 누락되어 예기치 않게 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