ファイル名の順序で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

おすすめ記事