複数のパターンを持つ最新の日付のファイルを探す[閉じる]

複数のパターンを持つ最新の日付のファイルを探す[閉じる]

以下のパターンの最新の変更日ファイルを見つける必要がある以下のコードスニペットがあります。

array=( ($find /path -type f \(-name "REF_DATA*" -0 -name "REF_CUST*" \) -printf %f\n' ))

複数の日付を持つファイルが/ pathディレクトリに存在する可能性があります。 findコマンドまたはls -ltrを介して同じ結果を得るにはどうすればよいですか?

ベストアンサー1

シェルを使用すると、短いシェルパターンを設定して、名前がパターンと一致する最近変更された一般的なファイルをzsh見つけることができます。/pathREF_DATA*

/path/**/REF_DATA*(.NDom[1])

このシェルグローブパターンでは、**すべてのレベルのサブディレクトリが一致します。最後の括弧は、前のワイルドカードパターンの動作を変更するワイルドカード修飾子です。この場合、ディレクトリや他のファイル形式ではなく、通常のファイルのみを一致させるように指定します。Nシェルでシェルオプションを有効にするのと同じ効果がありますD。一致するものがない場合は、パターンを削除し、パターンを隠された名前とそれぞれ一致させます。nullglobdotglobbash

最後の項目は、変更タイムスタンプomに基づいて[1]ファイルをソートし、最後に変更されたファイルであるソートされたセットの最初の項目を返します。

REF_DATA*最後に変更されたファイルを一致させるかREF_CUST*使用したいです。

/path/**/REF_(DATA|CUST)*(.NDom[1])

たとえば、次の一部のユーティリティでこのモードを使用できます。

printf '%s\n' /path/**/REF_(DATA|CUST)*(.NDom[1])

パス名のファイル名部分のみを取得するには、:tワイルドカードの末尾に追加します。

シェルでない場合は、zsh次のように呼び出すことができます。

zsh -c 'printf "%s\n" /path/**/REF_(DATA|CUST)*(.NDom[1]:t)'

または、2つのパターンのいずれかに一致する2つのファイルを別々の配列に配置するにはbash(両方のファイルが存在する場合、それ以外の場合は配列に1つまたは0の項目が表示されます)

array=(
    "$( zsh -c 'printf "%s\n" /path/**/REF_DATA*(.NDom[1]:t)' )"
    "$( zsh -c 'printf "%s\n" /path/**/REF_CUST*(.NDom[1]:t)' )"
)

ファイル名に改行がある場合はそれを削除できることに注意してください(一般的ではありませんが、技術的には可能です)。

そもそも手紙を書けばzsh当然電話はしないで、ただ電話しかしないのにzsh -c

array=(
    /path/**/REF_DATA*(.NDom[1]:t)
    /path/**/REF_CUST*(.NDom[1]:t)
)

おすすめ記事