以下のパターンの最新の変更日ファイルを見つける必要がある以下のコードスニペットがあります。
array=( ($find /path -type f \(-name "REF_DATA*" -0 -name "REF_CUST*" \) -printf %f\n' ))
複数の日付を持つファイルが/ pathディレクトリに存在する可能性があります。 findコマンドまたはls -ltrを介して同じ結果を得るにはどうすればよいですか?
答え1
シェルを使用すると、短いシェルパターンを設定して、名前がパターンと一致する最近変更された一般的なファイルをzsh
見つけることができます。/path
REF_DATA*
/path/**/REF_DATA*(.NDom[1])
このシェルグローブパターンでは、**
すべてのレベルのサブディレクトリが一致します。最後の括弧は、前のワイルドカードパターンの動作を変更するワイルドカード修飾子です。この場合、ディレクトリや他のファイル形式ではなく、通常のファイルのみを一致させるように指定します。N
シェルでシェルオプションを有効にするのと同じ効果がありますD
。一致するものがない場合は、パターンを削除し、パターンを隠された名前とそれぞれ一致させます。nullglob
dotglob
bash
最後の項目は、変更タイムスタンプ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)
)
答え2
そして統計資料Linuxでは、次のことができます。
find ... -exec stat -f "%Y %N" {} + |sort -rn|head -1|cut -f2
存在するmacOS統計、パラメータは異なる方法で定義されます。
find ... -exec stat -f "%m%t%N" {} + |sort -rn|head -1|cut -f2
アイデアは、ファイル名のリストと最後の修正時間(epoch秒)を返し、時間の降順でリストを並べ替え、リスト内の最後に変更されたオブジェクトの名前を傍受することです。
どちらの場合も、スペースを含むファイル名は、エポック秒とファイル名の間にタブ区切り文字を使用して処理されます。