現在のディレクトリの最後に変更されたサブディレクトリに切り替える

現在のディレクトリの最後に変更されたサブディレクトリに切り替える

定期的に複数のディレクトリに複数のファイルを生成するアプリケーションがあるため、作成された最新のファイル、つまり最新のディレクトリ(作成または更新)に生成されたファイルを確認する必要があります。ファイル名はすべてのディレクトリで同じままであるため、ディレクトリを最後に変更されたサブディレクトリに変更する単純なスクリプトのみが必要です。

[更新]ほとんどの回答を見て、ディレクトリ名が動的であるため(一部のユーザー入力やタイムスタンプによって)dir [1、2、3]などのディレクトリパターンを想定できないことを明確にする必要があると思いました。または同様

ベストアンサー1

これには複雑な配管は必要ありません。さらに、何もする必要はありませんfind。すべてのファイルがどこにあるかは既に知っていますが、そのうちどのファイルが最新であるかはわかりません。これは扱いやすいです。

これを実証するために、ここに小さなテストがあります。

mkdir ./dir1 ./dir2 ./dir3

for d in 1 2 3
do  touch ./dir$d/samefile
    sleep 1
done

これによりテストセットが作成されます。さて、どちらが最新ですか?

set -- ./dir[123]/samefile
while [ -e "$2" ]
do  [ "$1" -nt "$2" ] && 
    set -- "$@" "$1"
shift; done
printf %s\\n "$@"

それは私に教えてくれます。

出力

./dir3/samefile

touch作業順序を自由に変更できます。これにより、正しい情報が提供されます。必要なのは、次の関数内の小さなシェルループだけです。

newd() { ${2:+:} return 1
    while [ -e "$2" ] && [ -e "$1" ]
    do  [ "$1" -nt "$2" ] && 
        set -- "$@" "$1"
    shift; done
    ${2+false} cd "${1%/*}"
}

これはデモとは少し異なるため、引数が2つ未満の場合、または引数が実際のパス名でない場合は、確実に失敗します。

これで、次のように呼び出すことができます。

newd ./path/to/file1 ./path/to/file2

...など - 好きなだけ多くの引数を持つことができます。

または私のテストケースでは、次のようになります。

newd ./dir[123]/samefile ; pwd

出力

/home/mikeserv/test/dir3

おすすめ記事