web-dev-qa-db-ja.com

最大番号のファイル名を選択してください

私は以下のような日付のファイルのリストを持っています...

    filename_20120101.dat
    filename_20120102.dat
    filename_20120103.dat

(ファイルの日付スタンプではなく)ファイル名の日付に基づいて最新のファイルを選択するスクリプトが必要です。

6
Rich

ls(1)はファイルを名前でソートするため、ls | tail -1すべきです。

8
vonbrand

必須のzsh回答:

echo "The highest-numbered file is" filename_*.dat([-1])

これは、 glob qualifier[NUM]のglobであり、NUM番目の一致のみを保持します(負の値は最後の一致からカウントされます)。さまざまな幅の数値がある場合は、n修飾子を

% ls
filename_1.dat filename_12.dat filename_17.dat filename_2.dat filename_8.dat
% echo filename_*.dat([-1])
filename_8.dat
% echo filename_*.dat(n[-1])
filename_17.dat

グロブは単語のリストを検索するコンテキストでのみ発生するため、ファイル名を変数に割り当てる場合は、1つの要素を含む配列にする必要があります。

latest=(filename_*.dat[-1])
echo "The highest-numbered file is $latest"

どのシェルでも、位置引数を一致の完全なリストに設定し、最後の引数を保持できます。

set_latest () {
  eval "latest=\${$#}"
}
set_latest filename_*.dat
echo "The highest-numbered file is $latest"

これは、最後を番号順ではなくアルファベット順で返すことに注意してください。 filename_10.datfilename_09.datの後、filename_9.datの前です。