재귀 적으로 가장 큰 파일 찾기


41

디렉토리에서 가장 큰 파일을 재귀 적으로 찾으려고합니다. 해당 디렉토리 안에 서브 디렉토리가있는 경우 함수는 해당 디렉토리로 들어가서 가장 큰 파일이 있는지 확인해야합니다. 가장 큰 파일이 발견되면 상대 경로 이름과 가장 큰 파일의 이름 및 크기와 함께 출력이 표시됩니다.

전의:

dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628

이것이 내가 가진 것입니다 :

#!/bin/sh
clear

recursiveS() {
    for d in *; do
        if [ -d $d ]; then
            (cd $d; echo $(pwd)/$line; du -a; recursiveS;)
        fi
    done
}
recursiveS

나는 잠시 동안 붙어있다. 기존의 여러 유닉스 도구를 파이프 라이닝하여 구현할 수 없습니다. 어떤 아이디어라도 좋을 것입니다!



하위 디렉토리로만 이동하려면 for d in */ .[^.]*/;
Olivier Dulac

답변:


54

파일 크기를 가진 파일 이름을 출력 하려면 find(여기서는 GNU라고 가정 find) 사용 하십시오 . 종류. 가장 큰 것을 인쇄하십시오.

find . -type f -printf "%s\t%p\n" | sort -n | tail -1

파일 경로에 줄 바꿈 문자가 포함되어 있지 않다고 가정합니다.


에서 루프 사용 bash의 GNU의 구현을 stat:

shopt -s globstar
max_s=0
for f in **; do
  if [[ -f "$f" && ! -L "$f" ]]; then
    size=$( stat -c %s -- "$f" )
    if (( size > max_s )); then
      max_s=$size
      max_f=$f
    fi
  fi
done
echo "$max_s $max_f"

찾기 솔루션보다 훨씬 느립니다. 또한 파일 이름은 줄 바꿈 문자로 끝나지 않으며 숨겨진 파일을 건너 뛰고 숨겨진 디렉토리로 내려 가지 않는다고 가정합니다.

-현재 디렉토리에 호출 된 파일이 있으면 stdin에서 열린 파일의 크기가 고려됩니다.

bash4.3 이전의 버전은 디렉토리 트리를 내릴 때 기호 링크를 따랐다 는 점에 유의하십시오 .


고마워요! 도움을 주셔서 감사합니다. 쉘에서 프로그래밍을 사용하려고합니다. 나는 지금 많은 것을 알지 못하므로 해당 코드 줄에서 무슨 일이 일어나고 있는지 알려 주셔서 감사합니다.
user2419571

빠른 질문 : 호기심에서 파이프 명령없이 할 수있는 방법이 있습니까? 내가 본 모든 예제가 어떤 종류의 배관을 사용했기 때문에 궁금합니다.
user2419571

2
다른 방법이 있다고 확신합니다. 유닉스 철학은 도구가 단일 목적이어야하고 서로 연결되어 한 명령의 출력이 다음 명령의 입력으로 공급된다는 것입니다.
glenn jackman

말이 되네요 도와 주셔서 감사합니다.
user2419571

2
@ user2419571 : tail -n 1 <(sort -n <(find . -type f -printf "%s\t%p\n"));)
Cyrus

9

이 명령은 정의 된 크기도 나열하는 데 도움이됩니다.

find . -type f -size +100M -exec ls -lh {} \;

5

이것은 BSD / macOS에서 작동합니다 :

find . -type f -ls | sort -k7 -r

| head -n 3흥미로운 항목의 숫자를 표시하기 위해 추가 할 수도 있습니다 (이 경우 3).


1
이 답변은 작동 방식을 설명하여 향상시킬 수 있습니다. 또한 허용 된 답변과 매우 유사합니다 (작동 방식을 완전히 설명하지는 않음).
dhag 2016 년

man find그리고 man sort, 사용 brainz :-)
CeDeROM

크기를 올바르게 반환하지 못하고 많은 수의 열을 반환하므로 MacOS에서는 실제로 작동하지 않습니다.
sorin

3

zsh, 가장 큰 일반 파일 :

ls -ld -- **/*(.DOL[1])

(물론 ls -ld --어떤 명령으로도 대체 할 수 있습니다 . GNU ls또는 호환 가능한 경우 사람이 읽을 수있는 크기-h 옵션 도 참조하십시오 )

  • .: 일반 파일 만 (디렉토리, 심볼릭 링크, 장치, fifo 등은 아님)
  • D: 숨겨진 것들을 포함하고 숨겨진 디렉토리로 내려갑니다.
  • OL: 크기 ( Length)로 역순으로 정렬됩니다 .
  • [1]: 첫 번째 경기 만.

동점이 있으면 무작위로 그 중 하나를 얻게됩니다. 알파벳 순서로 첫 번째 문자를 원할 경우 추가 on( ame oby nrme)를 추가하여 타이를 알파벳순으로 정렬하십시오.

디스크 사용이 아닌 파일 크기를 고려합니다.


... 나는 당신이 zsh의 급여에 있다고 믿기 시작합니다.) (아주 잘 될 수 있습니까?). 불행히도 모든 시스템에서 zsh를 사용할 수있는 것은 아닙니다.
Olivier Dulac

처음 10 개의 파일을 얻을 수 있습니까? (루프처럼 멍청한 짓을하지 않고)
Wowfunhappy

1
대체 @Wowfunhappy [1][1,10]
스테판 Chazelas가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.