그래서 나는 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를 사용하여 find
epoch 시간의 수정 시간과 함께 파일을 나열한 다음 다음을 사용하여 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