n번째로 어린 파일을 나열하는 방법(ls를 구문 분석하지 않고!)

n번째로 어린 파일을 나열하는 방법(ls를 구문 분석하지 않고!)

그래서 나는 ls를 파싱하는 것이나쁜!.

오늘 나는 다음과 같은 덩어리를 발견했습니다.

FILENAME=`ls -t $READ_FOLDER | head -1`

그래서 나는 원래 이것이 최신 파일 이름을 얻기 위해 설계되었다고 믿습니다. 실제로 지금 그것을 조정하여 아마도 최신 파일 이름을 얻으려고 합니다.다섯 번째 장소최신 파일은 확인하는 과정이 좀 느리기 때문에 처리가 되었는지 알 수가 없습니다.

저는 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

따라서 다섯 번째 최신 파일은 입니다 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를 사용하여 findepoch 시간의 수정 시간과 함께 파일을 나열한 다음 다음을 사용하여 sort목록을 head정렬 할 수 있습니다 tail.

find . -maxdepth 1 -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5 | tail -1

답변4

한 가지 방법은 (파일 이름에 개행 문자가 없다고 가정)입니다.

ls -t ... | head -n5 | tail -n1

관련 정보