定期的に複数のディレクトリに複数のファイルを生成するアプリケーションがあるため、作成された最新のファイル、つまり最新のディレクトリ(作成または更新)に生成されたファイルを確認する必要があります。ファイル名はすべてのディレクトリで同じままであるため、ディレクトリを最後に変更されたサブディレクトリに変更する単純なスクリプトのみが必要です。
[更新]ほとんどの回答を見て、ディレクトリ名が動的であるため(一部のユーザー入力やタイムスタンプによって)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