n番目に若いファイルをリストする方法(lsを解析せずに!)

n番目に若いファイルをリストする方法(lsを解析せずに!)

だから私は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

関連情報