Programming

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

procodes 2020. 8. 24. 21:22
반응형

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


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

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

find . -type l | wc -l

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

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


링크 에서 인용-

특정 디렉토리 및 하위 디렉토리에서 가장 큰 파일 이름 (디렉토리 아님) 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 개의 가장 큰 파일을 인쇄합니다 (위의 모든 예에서).


현재 디렉토리 및 하위 디렉토리에서 상위 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


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단일 파일을 얻을 때까지 반복하여 다시 실행할 수 있음)이 접근 방식을 다소 손상시킵니다.


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

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

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

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


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 줄을 표시합니다.

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

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

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

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

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및 하위 디렉터리 에서 가장 큰 파일을 찾습니다 .


다음 한 줄짜리를 사용해보십시오 (가장 큰 파일 상위 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대신.

So these aliases are useful to have in your rc files:

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

Try following command :

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

This will print the largest file name and size and more than 500M. You can move the if($1 > 500000),and it will print the largest file in the directory.


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

or

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


Linux Solution: For example, you want to see all files/folder list of your home (/) directory according to file/folder size (Descending order).

sudo du -xm / | sort -rn | more


This script simplifies finding largest files for further action. I keep it in my ~/bin directory, and put ~/bin in my $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

That is quite simpler way to do it:

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

And you'll get this: 8445 examples.desktop


To list the larger file in a folder

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

The output of ls -sh is a sized s and human h understandable view of the file size number.

You could use ls -shS /pathFolder | head -n 1. The bigger S from ls already order the list from the larger files to the smaller ones but the first result its the sum of all files in that folder. So if you want just to list the bigger file, one file, you need to head -n 2 and check at the "second line result" or use the first example with ls sort head.


ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'

참고URL : https://stackoverflow.com/questions/12522269/how-to-find-the-largest-file-in-a-directory-and-its-subdirectories

반응형