ディレクトリ内でファイル名の末尾が文字列と一致する最後のファイルを検索します

ディレクトリ内でファイル名の末尾が文字列と一致する最後のファイルを検索します

ワークフローを高速化するために、ファイルを作成/コピーするスクリプトを作成しています。このインスタンスでは、特定の文字列で終わるファイルをディレクトリで検索する必要があり、1 つ以上のファイルが見つかった場合は、シーケンスの最後のファイルをコピー対象にする必要があります。(何も見つからない場合、スクリプトは別のディレクトリから新しいファイルをコピーします)。

このディレクトリには、次の形式に従う複数のファイル セットを含めることができます。

YYYYMMDD_##_user_filename.json

したがって、例のフォルダーには次の内容が含まれる場合があります。

20161021_01_test_parameters.json
20161021_01_test_stack.json
20161021_02_test_parameters.json
20161021_02_test_stack.json
20161022_03_test_parameters.json
20161025_04_test_parameters.json
20161025_04_test_stack.json

この例では、末尾が であるファイルを読み取りparameters.json、バージョン番号 (01、02 など) に基づいて並べ替えて、シーケンスの最後のファイルを見つけるスクリプトが必要です。次に、このファイルを次のバージョン番号を使用して同じフォルダーにコピーする必要があります。この目的のために日付は無関係であり、バージョン番号が重複することはないと想定できます。

私はif [ -e $1/*"parameters.json" ]; then cp $1/*"parameters.json" "$FILENAME"_parameters.json($1これらのファイルが移動されるディレクトリはどこにあるか - スクリプトは実行されるディレクトリの外部にあり、$FILENAME場所、日付、バージョン番号などを計算するための変数にすぎないため重要です) を使用していましたが、もちろん、これは最新のものを見つけることには役立ちません。

答え1

並べ替える数値は常に2番目のアンダースコアで区切られたフィールドであるため、次のようなものを使用できるはずです。

find path/to/dir/ -maxdepth 1 -name '*parameters.json' | sort -t_ -nk2,2 | tail -n1

ファイル名に改行が含まれる可能性を処理する必要があり、コアユーティリティがそれをサポートしている場合は、コマンド全体をヌル区切りにすることができます。例:

find path/to/dir/ -maxdepth 1 -name '*parameters.json' -print0 | sort -zt_ -nk2,2 | tail -zn1

関連情報