디렉토리와 하위 디렉토리에서 가장 큰 파일을 찾는 방법은 무엇입니까?


102

우리는 이제 막 UNIX 수업을 시작하고 다양한 Bash 명령을 배우고 있습니다. 우리의 할당은 그 아래에 많은 폴더가있는 디렉토리에서 다양한 명령을 수행하는 것을 포함합니다.

다음을 사용하여 루트 폴더의 모든 일반 파일을 나열하고 계산하는 방법을 알고 있습니다.

find . -type l | wc -l

그러나 전체 디렉토리에서 가장 큰 파일을 찾기 위해 거기에서 어디로 가야할지 알고 싶습니다. 나는 du명령 에 관한 것을 보았지만 우리는 그것을 배우지 않았기 때문에 우리가 배운 것들의 레퍼토리에서 나는 그것을 어떻게 든 ls -t명령에 연결해야한다고 가정합니다 .

그리고 내 '링고'가 정확하지 않다면 용서 해주세요, 나는 여전히 그것에 익숙해지고 있습니다!


2
명령에 대해 알고 있지만 사용 방법을 잘 모르겠다면 man관심있는 명령을 입력 한 다음 입력 해보십시오 . Up은 해당 명령에 대한 멋진 수동 항목을 표시합니다 ( q명령 줄로 돌아가려면 누르기 ).
Dunes

답변:


126

링크 에서 인용-

특정 디렉토리 및 하위 디렉토리에서 가장 큰 파일 이름 (디렉토리 아님) 10 개를 찾아 인쇄하려는 경우

$ find . -printf '%s %p\n'|sort -nr|head

검색을 현재 디렉토리로 제한하려면 find와 함께 "-maxdepth 1"을 사용하십시오.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

그리고 상위 10 개의 가장 큰 "파일 및 디렉토리"를 인쇄하려면 :

$ du -a . | sort -nr | head

** 위의 유일한 "head"대신 "head -n X"를 사용하여 상위 X 개의 가장 큰 파일을 인쇄합니다 (위의 모든 예에서).


1
"du -a. | sort -nr | head"가 실제 파일 크기보다 두 배의 KB 수를 반환하는 이유는 무엇입니까?
xxjjnn

6
아, 'k'옵션을 추가해야합니다. 그렇지 않으면 1024가 아닌 512 바이트의 배수가 표시됩니다. du -ak
xxjjnn

2
첫 번째는 사람이 읽을 수있는 형식으로 크기를 어떻게 얻습니까?
Bluz

나는 대체하려고 것 @Bluz '%s %p\n''%p\n'하고 추가 |xargs ls -lh
던컨 X 심슨

6
첫 번째 솔루션은 나를 위해 OS X에서 작동하지 않았기 때문에 빠른 해킹을 사용하여 세 번째 솔루션에서 디렉토리를 필터링했습니다 du -am . | sort -nr | grep '\..*\.' | head. 은 m메가 바이트 단위로 표시 파일 크기이며 사용 grep(가)가 처음에, 적어도 두개의 도트 표시 라인 ./의 경로에서, 제는 예를 들어 파일의 확장자이다 .mov.
psmith

63

현재 디렉토리 및 하위 디렉토리에서 상위 25 개 파일을 찾으려면 다음을 수행하십시오.

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

이렇게하면 "sort -nr -k5"파이프 명령을 통해 파일 크기를 기준으로 정렬하여 상위 25 개 파일이 출력됩니다.

동일하지만 사람이 읽을 수있는 파일 크기 :

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

출력

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

파일 이름 만 원하는 경우 :

find . -type f | xargs ls -1S | head -n 1

이것은 사용을 피하고에서 awk원하는 플래그를 사용할 수있게합니다 ls.

주의 사항 . xargs너무 긴 명령 줄을 작성하지 않으려 고 하기 때문에 파일이 많은 디렉토리에서 실행하면 ls두 번 이상 실행 되기 때문에 실패 할 수 있습니다 . 극복 할 수없는 문제는 아니지만 ( head -n 1ls호출 에서 출력을 수집하고 ls -S단일 파일을 얻을 때까지 반복하여 다시 실행할 수 있음)이 접근 방식을 다소 손상시킵니다.


미안 해요 xargs, 난 당신에게 하나 소홀히
스티브

2
공백이있는 파일 이름을 처리하려면 다음을 사용하십시오.find . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

이것은 첫 번째 배치에서만 xargs실행 된 가장 큰 파일을 찾습니다 . 이를 수정하려면 정렬 추가 : find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. 나를 위해 OSX에서 일했습니다.
psmith

10

Linux / UNIX / BSD 파일 시스템에서 가장 큰 파일 / 디렉토리를 찾는 데 사용할 수있는 간단한 명령은 없습니다. 그러나 다음 세 가지 명령 (파이프 사용)을 조합하면 가장 큰 파일 목록을 쉽게 찾을 수 있습니다.

# du -a /var | sort -n -r | head -n 10

사람이 더 읽을 수있는 출력을 원한다면 다음을 시도하십시오.

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

어디,

  • Var 은 검색하려는 디렉토리입니다.
  • du 명령 -h 옵션 : 사람이 읽을 수있는 형식 (예 : 1K, 234M, 2G)으로 크기를 표시합니다.
  • du 명령 -s 옵션 : 각 인수에 대한 합계 만 표시 (요약).
  • du 명령 -x 옵션 : 다른 파일 시스템의 디렉토리를 건너 뜁니다.
  • sort 명령 -r 옵션 : 비교 결과를 반대로합니다.
  • 정렬 명령 -h 옵션 : 사람이 읽을 수있는 숫자를 비교합니다. 이것은 GNU 정렬 전용 옵션입니다.
  • 헤드 명령 -10 또는 -n 10 옵션 : 처음 10 줄을 표시합니다.

두 번째 명령이 더 좋지만 osx에서는 정렬 버전에 대한 -h 옵션이 설치되어 있지 않습니다. Mac 용이어야합니다. du -hsx * | 정렬 -rn | head -10
Yann VR

1
두 번째 명령을 좋아합니다! 내가 시도한 모든 것 중 가장 좋은 것은 나중을 위해 저장하겠습니다.
CodeMouse92

명령을 자세히 설명합니다. +1
Harish

8

이것은 파일이 일반 파일 인 경우 재귀 적으로 나열하고 7 번째 필드 (내 find출력의 크기입니다 . 확인하십시오)로 정렬 하고 첫 번째 파일 만 표시합니다.

find . -type f -ls | sort +7 | head -1

의 첫 번째 옵션 find은 재귀 검색의 시작 경로입니다. - f일반 파일 검색 유형 . 이것을 파일 이름으로 구문 분석하려고하면 파일 이름에 공백, 줄 바꿈 또는 기타 특수 문자가 포함되어 있으면 실패 할 수 있습니다. 옵션 sort은 운영 체제에 따라 다릅니다. 저는 FreeBSD를 사용하고 있습니다.

"더 좋지만"더 복잡하고 무거운 솔루션은 find디렉토리를 순회하는 것입니다.하지만 stat파일에 대한 세부 정보를 가져 오는 데 사용 awk하고 가장 큰 크기를 찾는 데 사용할 수 있습니다. 의 출력 stat도 운영 체제에 따라 다릅니다.


1
+7arg 는 무엇을 의미합니까? 내 컴퓨터 정렬에서 .txt라는 파일을 찾을 수 없다고 불평합니다 +7.
Dunes

@Dunes-내가 말했듯이 sort시스템 의 man 페이지를 확인하십시오 . 나는 FreeBSD의의 종류에서 사용 도출이 순간에 OS X 10.4을 사용하고 있습니다 : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]...를 참고 +POS [-POS2]. 이것은 FreeBSD의 현재 버전에서도 작동합니다.
ghoti

2
나에게 다른 정렬 프로그램이있는 것 같습니다. 이것은 내 정렬 프로그램의 맨 페이지입니다.- linux.die.net/ man/1/sort 이것이 내 컴퓨터에서 작동하려면 명시 적으로 -karg eg를 사용해야합니다 . sort -k 7. 편집 : OSX 10.5에서 정렬을위한 man 페이지가 내가 가지고있는 버전으로 변경된 것 같습니다.
Dunes

1
@Dunes-모두 GNU 정렬이지만 다른 버전입니다. [+POS1] [-POS2]표기는 이전입니다. 내가 알 수있는 한,이 표기법은 여전히 ​​최신 GNU 정렬에서 지원되지만 지금은 버전 5.1 이후 정렬 맨 페이지에서 삭제 된 것 같습니다. FreeBSD 4.11 정렬을위한 man 페이지에서 볼 수 있습니다 . FreeBSD 5.0이 출시되기 전부터 sort의 man 페이지를 읽지 않은 것 같습니다!
ghoti

또한 +POS1정렬 매개 변수는 0 -k POS1부터 계산 하지만 1부터 계산합니다.
ghoti

6

현재 작업 디렉토리에서 가장 큰 파일 또는 폴더를 찾습니다.

ls -S /path/to/folder | head -1

모든 하위 디렉토리에서 가장 큰 파일을 찾으려면 :

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

ls의 기본 동작은 열 (즉, 한 줄에 여러 항목)에 파일을 나열하는 것이므로 첫 번째 파일은 가장 큰 파일 만 정확하게 찾지 못합니다. 두 번째 명령과 관련하여 주어진 디렉토리에서 가장 큰 파일 만 찾았고 하위 디렉토리는 찾지 못했습니다.
Dunes

@Dunes : 맞습니다. 첫 번째 명령 디렉터리를 찾을 있지만 ls. 내 테스트에서 -S플래그는 한 줄에 하나의 파일을 나열합니다. 두 번째 명령을 수정했습니다. 바라건대 이제 완전한 증거입니다. 감사합니다.
Steve

4

Solaris에서는 다음을 사용합니다.

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

또는

find . -type f -ls | sort -nrk7 | head -1 #unformatted

여기에 게시 된 다른 것은 작동하지 않았기 때문입니다. 그러면 $PWD및 하위 디렉터리 에서 가장 큰 파일을 찾습니다 .


2

다음 한 줄짜리를 사용해보십시오 (가장 큰 파일 상위 20 개 표시).

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

또는 (사람이 읽을 수있는 크기) :

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

find의 -printf옵션이 OSX / BSD에 존재하지 않고 statOS에 따라 다른 매개 변수를 가지고 있기 때문에 다른 답변과 비교하여 Linux / BSD / OSX에서 잘 작동합니다 . 그러나 제대로 OSX / BSD에 작업에 두 번째 명령은 (등 sort이없는 -h) 설치 sort에서 coreutils제거 -h에서 ls사용이 sort -nr대신.

따라서 이러한 별칭은 rc 파일 에 포함하는 데 유용 합니다.

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

경로가없는 파일 이름 만 표시하므로 실제로 가장 큰 파일을 찾는 데 도움이되지 않습니다.
psmith 2017

나를 위해 상단에 정말 큰 파일을 가지고 있지만, 마지막에이 나에게 올바른 파일을 제공하지 않습니다
Borislav 마르코프

2

다음 명령을 시도하십시오.

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

이렇게하면 가장 큰 파일 이름과 크기 및 500M 이상이 인쇄됩니다. 를 이동할 수 있으며 if($1 > 500000)디렉토리에서 가장 큰 파일이 인쇄됩니다.


1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

또는

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


0

이 스크립트는 추가 작업을 위해 가장 큰 파일 찾기를 단순화합니다. 나는 그것을 ~ / bin 디렉토리에 보관하고 ~ / bin을 내 $ PATH에 넣습니다.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

그것은 그것을하는 아주 간단한 방법입니다 :

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

그리고 당신은 이것을 얻을 것입니다 : 8445 examples.desktop


1***마지막에 무엇을 해야합니까? 해당 인수에 대해 "일치하는 항목 없음"오류가 발생합니다.
user4815162342

0

Linux 솔루션 : 예를 들어, 파일 / 폴더 크기 ( 내림차순 ) 에 따라 홈 (/) 디렉토리의 모든 파일 / 폴더 목록을 보려고합니다 .

sudo du -xm / | 정렬 -rn | 더


0

폴더에있는 더 큰 파일을 나열하려면

ls -sh /pathFolder | sort -rh | head -n 1

의 출력은 ls -sh정립이다 s인간 h파일 크기 번호의 이해보기.

사용할 수 있습니다 ls -shS /pathFolder | head -n 1. 더 큰 S에서 ls이미이 작은 것들에 큰 파일의 목록을 주문하지만, 먼저 해당 폴더에있는 모든 파일의 합계를 초래한다. 따라서 더 큰 파일, 하나의 파일 만 나열 head -n 2하려면 "두 번째 줄 결과"를 확인하거나 ls sort head.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.