ls
재귀 호출을 수행 할 때 파일을 올바르게 정렬하지 않는 것 같습니다 .
ls -altR . | head -n 3
디렉토리 (하위 디렉토리 포함)에서 가장 최근에 수정 된 파일을 어떻게 찾을 수 있습니까?
답변
find . -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "
거대한 나무의 경우 sort
모든 것을 메모리에 보관하기 가 어려울 수 있습니다 .
%T@
유닉스 타임 스탬프와 같은 수정 시간을 제공하고, sort -n
숫자로 정렬 tail -1
하고, 마지막 라인 (가장 높은 타임 스탬프)을 취하고 cut -f2 -d" "
, 출력에서 첫 번째 필드 ( 타임 스탬프)를 잘라냅니다.
편집 : 것처럼 -printf
아마의 GNU 전용 ajreals 사용하다 stat -c
너무. BSD에서도 같은 작업을 수행 할 수 있지만 포맷팅 옵션이 다릅니다 ( -f "%m %N"
보여 질 것입니다)
그리고 나는 복수의 일부를 놓쳤다. 당신이 더 많은 그런 다음 원하는 경우 최신 파일을 바로 꼬리 인수를 범프.
답변
@ plundra ‘s answer 다음에 BSD 및 OS X 버전이 있습니다.
find . -type f -print0 | xargs -0 stat -f "%m %N" |
sort -rn | head -1 | cut -f2- -d" "
답변
결과를 정렬하고 마지막으로 수정 된 결과 만 유지하는 대신 awk를 사용하여 수정 시간이 가장 큰 결과 만 인쇄 할 수 있습니다 (유닉스 시간).
find . -type f -printf "%T@\0%p\0" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\0'
파일 수가 충분하면 문제를 해결하는 가장 빠른 방법입니다.
이론적으로 파일 이름에는 공백과 줄 바꿈을 포함한 모든 문자가 포함될 수 있지만 NUL 문자 (예 : ‘\ 0’)를 사용했습니다.
시스템에 병리학 적 파일 이름이 없으면 줄 바꿈 문자도 사용할 수 있습니다.
find . -type f -printf "%T@\n%p\n" | awk '
{
if ($0>max) {
max=$0;
getline mostrecent
} else
getline
}
END{print mostrecent}' RS='\n'
또한 이것은 멍청이에서도 작동합니다.
답변
나는이 솔라리스 10에서 마지막으로 수정 된 파일을 찾을 수있는 문제가 있었다 find
이없는 printf
옵션 및 stat
사용할 수 없습니다입니다. 나는 나에게 잘 맞는 다음 해결책을 발견했다.
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7 }' | sort | tail -1
파일 이름을 표시하려면
find . -type f | sed 's/.*/"&"/' | xargs ls -E | awk '{ print $6," ",$7," ",$9 }' | sort | tail -1
설명
find . -type f
모든 파일을 찾아서 나열합니다sed 's/.*/"&"/'
공백을 처리하기 위해 경로 이름을 따옴표로 묶습니다.xargs ls -E
에 인용 된 경로를 전송ls
,-E
옵션은 풀 타임 스탬프 (형식 있는지 확인합니다 년 – 월 – 일시 – 분 – 초 – 나노초가 ) 반환awk '{ print $6," ",$7 }'
날짜와 시간 만 추출awk '{ print $6," ",$7," ",$9 }'
날짜, 시간 및 파일 이름 추출sort
날짜별로 정렬 된 파일을 반환합니다tail -1
마지막으로 수정 된 파일 만 반환
답변
하위 디렉토리에서도 잘 작동하는 것 같습니다.
find . -type f | xargs ls -ltr | tail -n 1
파일이 너무 많으면 찾기를 세분화하십시오.
답변
사람이 읽을 수있는 타임 스탬프가있는 최신 파일을 표시합니다.
find . -type f -printf '%TY-%Tm-%Td %TH:%TM: %Tz %p\n'| sort -n | tail -n1
결과는 다음과 같습니다.
2015-10-06 11:30: +0200 ./foo/bar.txt
더 많은 파일을 표시하려면 더 -n1
높은 숫자로 바꾸십시오
답변
나는 가장 최근에 수정 된 파일의 최상위 k 목록뿐만 아니라 항상 비슷한 것을 사용합니다. 큰 디렉토리 트리의 경우 정렬을 피하는 것이 훨씬 빠릅니다 . 가장 최근에 수정 된 파일이 최상위 1 개인 경우 :
find . -type f -printf '%T@ %p\n' | perl -ne '@a=split(/\s+/, $_, 2); ($t,$f)=@a if $a[0]>$t; print $f if eof()'
170 만 개의 파일이 포함 된 디렉토리에서 정렬을 사용하여 25.5s 솔루션에 비해 7.5 배 빠른 3.4s의 최신 파일을 얻습니다.