複数のディレクトリにある複数のファイルの最新バージョンを探す

複数のディレクトリにある複数のファイルの最新バージョンを探す

私はアプリケーションを作成しており、前提条件の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.logx*

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ステップでは、パス内の改行文字の後ろの部分が切り捨てられるため、パスに改行文字が含まれていると、この関数は正しく機能しません。そのような道がないことを祈ります;-)

おすすめ記事