だから私はlsを解析する悪い!。
今日、私は次の塊を見つけました。
FILENAME=`ls -t $READ_FOLDER | head -1`
だから私はもともとこれが最新のファイル名を取得するように設計されていると思います。実際、今それを調整して、おそらく最新のファイル名を取得しようとしています。5番目の場所最新のファイルは確認するプロセスが少し遅いので処理が行われたかどうかはわかりません。
私はbashで作業していますが、sh-genericソリューションには反対しません。
答え1
パースリー:
#!/usr/bin/env perl
use strict;
use warnings;
my %files_by_mtime;
foreach my $file ( glob ( "./*" ) ) {
my ( $mtime ) = (stat($file))[9];
$files_by_mtime{$file} = $mtime;
}
foreach my $f ( sort { $files_by_mtime{$b} <=> $files_by_mtime{$a} } keys %files_by_mtime ) {
print "$f $files_by_mtime{$f}\n";
}
次に縮小:
perl -e '%f = map { $_ => (stat)[9] } glob("./*");print "" . ( sort { $f{$b} <=> $f{$a} } keys %f )[4];'
Perl配列は0から始まるので、「N」番目のファイルは4です。
答え2
GNUツールにアクセスできると仮定すると(Linuxを実行している場合は可能です)stat
。たとえば、
$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:49 file1
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:39 file2
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:29 file3
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:19 file4
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:09 file5
-rw-r--r-- 1 terdon terdon 0 Sep 15 15:59 file6
-rw-r--r-- 1 terdon terdon 0 Sep 15 15:49 file7
したがって、5番目の最新のファイルはですfile5
。印刷するには:
$ stat --printf '%Y %n\0' * | sort -zrnk1 |
awk -vRS='\0' 'NR==5{sub(/^[^ ]* /,"",$0); print}'
その後、N(例では5)を引数として使用できるシェル関数に簡単に配置できます。次の行をあなた~/.bashrc
またはそれに対応する項目に追加します。
nthfile() {
stat --printf '%Y %n\0' * | sort -zrnk1 |
awk -vRS='\0' -vn="$1" 'NR==n{sub(/^[^ ]* /,"",$0); print}'
}
これにより、ディレクトリも表示されます。隠しファイルを一致させるには、上記のコマンドのshopt -s dotglob
前に実行します(bashを使用していると仮定)。
説明する
stat --printf '%Y %n\0' *
:現在のフォルダ内の各ファイルまたはディレクトリに対して、エポック()以降の変更日(秒%s
)とファイル名を印刷し、各行%n
は置き換えで終了します。これにより、改行文字を含むファイル名を正しく処理できます。\0
\n
sort -zrnk1
:-r
出力を逆順()で並べ替えます(最新の項目から古い項目まで)。 nullで終わる入力ラインを期待するように指示します-z
。数値で並べ替えて並べ替えるときは、最初のフィールドのみを考慮するように指示しますsort
。-n
-k1
awk
:-vRS='\0'
:入力レコード(行)区切り記号をに設定します\0
。vn=$1
:変数をn
関数への入力として与えられた値に設定します。NR==n{}
:オンラインでのみ実行されますn
(最初の例では5)。sub(/^[^ ]* /,"",$0); print
:^[^ ]*
行の先頭()から最初のスペースまで、スペース以外の文字をすべて置き換えて結果を印刷します。
答え3
GNUを使用してfind
エポック時間の修正時間とともにファイルを一覧表示し、次のようにsort
リストをhead
並べ替えることができますtail
。
find . -maxdepth 1 -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5 | tail -1
答え4
1つの方法は(ファイル名に改行文字がないと仮定)です。
ls -t ... | head -n5 | tail -n1