私はアプリケーションを作成しており、前提条件の1つは、複数のディレクトリを調べて各ファイルの最新バージョンを見つけることができることです。
最新のファイルを正常に使用してインポートls
したが、同じファイルが複数のディレクトリにある場合は、各ファイルの最新バージョンではありません。find
注目すべき点の1つは、ファイル名は必ずしもわかりませんが、ディレクトリ名はわかっていることです。
例:DIR1、DIR2、DIR3 にはそれぞれ FileA バージョンと FileB バージョンが含まれています。 3つ以上のディレクトリに含まれる最新バージョンのFileAとFileBが必要です。
誰にもアイデアがありますか?
ベストアンサー1
正しいツールを選択しました。
ls -t
ファイルを時間別にソートして最新のファイルを選択するのに最適な方法です。find
ディレクトリとサブディレクトリで特定のパターンに一致するファイルを見つけるのに適したツールです。
もちろん、トリッキーな部分は、ファイル名ごとに一種のグループ化が必要で、各グループから最新のファイルを選択する必要があるということです。これらの要件のために、最新バージョンを見つけるために各ターゲットファイル名を繰り返すループが必要だと思います。
ファイルがまたはにあると仮定すると、$dir1
次$dir2
のよう$dir3
にいくつかのスキーマの最新バージョンを見つける関数を作成できます。
find_latest() {
pattern=$1
ls -t "$dir1/$pattern" "$dir2/$pattern" "$dir3/$pattern" | head -n 1
}
その後、パターンがあると仮定すると、access.log
次のように繰り返すことができます。error.log
x*
for pattern in access.log error.log 'x*'; do
latest=$(find_latest 'a*')
echo $latest
done
上記の仮定が維持されず、ファイルが$dir1
、 または$dir2
のサブディレクトリにある可能性がある場合を$dir3
使用しなければ、find
もう少し複雑になります。
find_latest() {
pattern=$1
find "$dir1" "$dir2" "$dir3" -name "$pattern" -print0 | xargs -0 ls -t | head -n 1
}
小さな注意事項があります。このhead -n 1
ステップでは、パス内の改行文字の後ろの部分が切り捨てられるため、パスに改行文字が含まれていると、この関数は正しく機能しません。そのような道がないことを祈ります;-)