디렉토리와 하위 디렉토리에서 가장 큰 파일을 찾는 방법은 무엇입니까?
우리는 이제 막 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 1
각 ls
호출 에서 출력을 수집하고 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에 존재하지 않고stat
OS에 따라 다른 매개 변수를 가지고 있기 때문에 다른 답변과 비교하여 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;}'
'Programming' 카테고리의 다른 글
JavaScript for 루프로 json을 만드는 방법은 무엇입니까? (0) | 2020.08.24 |
---|---|
키 누르기 이벤트 후 jquery .val ()을 어떻게 얻을 수 있습니까? (0) | 2020.08.24 |
새 Gradle 프로젝트 가져 오기 실패 : 빌드 도구 수정 버전 * .0.0을 찾지 못했습니다. (0) | 2020.08.24 |
jQuery, 간단한 폴링 예제 (0) | 2020.08.24 |
다른 요소 다음에 처음 발생하는 요소 선택 (0) | 2020.08.24 |