{size}보다 큰 파일을 날짜별로 정렬하여 나열


27

'20MB 이상의 현재 디렉토리에서 가장 최근 10 개의 파일을 나열하십시오'라는 문제를 해결하고 싶습니다.

로에게 ls내가 할 수있는 :

ls -Shal |head

가장 큰 10 개의 파일을 얻으려면 :

ls -halt |head

가장 최근 10 개 파일을 가져 오려면

찾기로 할 수있는 일 :

find . -size +20M

현재 디렉토리 (및 원하지 않는 하위 디렉토리)에 20MB가 넘는 모든 파일을 나열합니다.

특정 크기의 가장 최근 10 개 파일을 나열하는 방법이 ls있습니까?

답변:


24

의 '현재 디렉토리'옵션은 find입니다 -maxdepth 1. 귀하의 요구에 대한 전체 명령 줄은 다음과 같습니다.

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

또는

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

참고 : 이것은 GNU-find에서 작동하지만 다른 모든 것은 아닙니다.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

@Rajish처럼 시작하지만 printffrom 명령 find을 사용하여 출력 형식을 지정하십시오. 이 3 시간 관련 형식이다 에 atime, ctime이에 mtime은 - %Tmtime에 대한되고, %A그리고 %C다른 포맷이다.

@에포크 이후의 시간 형식을 초 단위로 지정하는 것입니다. %f파일 이름, \n두 파일 사이의 줄 바꿈입니다.

그런 다음 숫자를 역순으로 정렬하면 가장 어린 파일이 먼저 나오고을 사용하여 20 줄 ¹을 head받습니다.

결국, sed시간 정보를 버리는 데 사용됩니다.

¹) head한 줄씩 작동하므로 이름에 20 개 이상의 줄 바꿈이있는 단일 파일은 조금 특이하지만 금지되지는 않지만 처음 20 개 일치에 속하는 경우 출력을 손상시킬 수 있습니다. 그러한 파일이 있으면 파일을 제거하십시오-이름을 바꾸십시오. 간단한 스크립트에서는 종종 문제가됩니다.


1
file-ls명령 을 사용 하면 특수 문자가 백 슬래시 이스케이프 문자로 인쇄됩니다 find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. 또한 형식은 ls -l, EoghanM도 지정 -l했습니다.
manatwork

printf특정 GNU 배포판에서만 작동합니다.
Brethlosze

%T+같은 인간이 읽을 수있는 타임 스탬프를 생성 2018-11-06+13:37:54.4606466460하여도 정렬되는 sort(이없이 -n), 참조 : unix.stackexchange.com/questions/29899/...
치로 틸리新疆改造中心法轮功六四事件

5

Zsh의 glob 한정자 는 이것을 쉽게 만듭니다. .예선만을 선택 일반 파일, Lm+2020MB 이상의 플러스 긴 한 바이트에있는 선택 파일; 정확히 20MB 길이의 파일을 포함 시키려면을 사용하십시오 L+20971519. 그런 다음 om수정 시간을 줄임으로써 정렬 [1,10]하고 확장을 처음 10 개 일치로 제한합니다. 날짜별로 파일을 나열하려면 여전히 -t옵션이 필요합니다 ls. 또는 파일을 다른 명령 (가장 먼저)에 전달할 수 있습니다. 가장 오래된 파일이있는 다른 명령으로 파일을 전달하려면 Om수정 시간을 늘려 정렬 [-10,-1]하고 마지막 10 개의 일치 항목을 추출하는 데 사용하십시오.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

이것이 문제를 해결하는 더 좋은 방법이라고 생각합니다 ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

찾기 권한이없는 파일에 대한 액세스 시도 중에 오류를 제거하려면 추가 할 수 있습니다.

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

파일 이름에 포함 된 개행 문자에 관계없이 지정된 10 개 파일 만 인쇄합니다. 파일 시스템을 사용합니다inodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

모든 답변에 감사드립니다. 내가 간 것은 다음과 같습니다.

ls -halt | grep "M " |head

메가 바이트 (및 기가 바이트 미만)보다 20 메가 바이트를 선호하더라도 파일 크기의 사람이 읽을 수있는 요소를 쉽게 기억하고 보존합니다.


4
당신은해야 하지 의 출력을 구문 분석을 시도 ls그것은 아무것도 더, 당신이 파일의 표현을 보여줍니다. 간단한 파일 이름의 경우 출력은 대부분 파일 이름과 동일하지만 그 결과에 의존해서는 안됩니다.
Chris Down

그것이 사실이지만, 인간 사용자 (그리고 다른 곳에서 파이프되지 않은 출력)의 관점에서, 이것은 알려진 간단한 도구 tldp.org/LDP/GNU-Linux-
EoghanM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.