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

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

재귀적으로 디렉터리에서 가장 큰 파일을 찾으려고 합니다. 디렉터리 내에 하위 디렉터리가 있는 경우 함수는 디렉터리로 이동하여 가장 큰 파일이 있는지 확인해야 합니다. 가장 큰 파일을 찾으면 상대 경로 이름과 가장 큰 파일의 이름 및 크기가 포함된 출력이 표시됩니다.

전임자:

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

나는 한동안 막혔습니다. 기존의 많은 Unix 도구를 파이핑하여 이를 달성할 수는 없습니다. 어떤 아이디어라도 좋을 것입니다!

답변1

파일 이름과 파일 크기를 출력하려면 find(여기서는 GNU로 가정 )을 사용하십시오 . find유형. 가장 큰 것을 인쇄하세요.

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

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


bashGNU 구현에서 루프 사용하기 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"

이는 해결책을 찾는 것보다 훨씬 느립니다. 이는 또한 파일 이름이 개행 문자로 끝나지 않고 숨겨진 파일을 건너뛰고 숨겨진 디렉터리가 입력되지 않는다고 가정합니다.

호출되는 현재 디렉토리에 파일이 있는 경우 -표준 입력에서 열려 있는 파일의 크기가 고려됩니다.

4.3 이전 버전에서는 bash디렉토리 트리를 내려갈 때 심볼릭 링크를 따라갔습니다.

답변2

이 명령은 정의된 크기를 나열하는 데에도 유용합니다.

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

답변3

이는 BSD/macOS에서 작동하며 빠르지만 POSIX가 아닌 유틸리티 -ls확장을 사용합니다 find.

find . -type f -ls | sort -k7 -r | head -n 3

속도는 느리지만 -ls확장 기능을 사용할 수 없는 POSIX 시스템 에서는 작동할 수 있습니다 find.

find . -type f -exec ls -al {} \; | sort -k5 -r | head -n3

작동 방식:

  • find아래 설명된 특정 쿼리를 기반으로 결과를 표시하는 강력한 파일 검색 유틸리티입니다.
  • find .현재 작업 디렉토리에서 검색합니다.
  • find . -type f지정된 파일 형식 "f"만 검색됩니다. 즉, 일반 파일입니다(디렉토리, 특수 파일, 링크, 소켓 등을 건너뜁니다).
  • -ls스위치는 find발견된 파일에 대한 전체 정보를 표시하도록 표시됩니다. 그러나 BSD 시스템 담당자에 따르면 이는 IEEE Std 1003.1-2001("POSIX.1") 표준의 확장이며 모든 플랫폼에서 작동하지 않을 수 있습니다.
  • 또는 -ls시스템에서 확장을 사용할 수 없는 경우 명령을 -exec .. {} \;사용 하고 5번째 필드를 사용하여 결과를 정렬할 수 있습니다. 발견된 파일 이름을 나타냅니다. 명령이 포함되어 있습니다 .ls -al{}\;-exec
  • |유닉스 기호는 한 프로그램의 출력을 다른 프로그램의 입력으로 리디렉션하는 "파이프"를 의미합니다. find프로그램 출력 텍스트를 sort프로그램에 대한 입력 으로 보냅니다 .
  • sort정렬 유틸리티입니다. 데이터 행을 가져온 다음 결과에 따라 행을 오름차순으로 정렬합니다.
  • sort -k77번째 필드가 정렬 매개변수 값으로 사용됨을 나타냅니다. 매개변수는 공백으로 구분됩니다. 7번째 매개변수는 유틸리티에 의해 생성된 파일의 크기입니다 find. -exec ls -al {} \;대신 사용하는 경우 -ls다섯 번째 필드를 사용하여 -k5정렬하게 됩니다.
  • -rsort가장 큰 것을 먼저 배치하여 역 정렬을 사용하도록 지시합니다 . 왜냐하면 우리는 가장 큰 파일을 먼저 보고 싶기 때문입니다.
  • 또한 수백 줄을 실제로 보고 싶지 않은 경우 |정렬된 출력을 head지침에 따라 결과 출력의 처음 세 줄만 표시하는 유틸리티로 파이프할 수도 있습니다.-n 3

간단히 말해서: 일반 파일을 재귀적으로 찾는 데 사용됩니다. 현재 작업 디렉터리에서만 검색을 시작한 다음 확장자(또는 실행)를 사용하여 find파일에 대한 전체 정보를 표시합니다. 나중에 Unix 파이프를 사용하여 결과를 에 전달하고 먼저 7번째(또는 5번째) 필드를 기준으로 가장 큰 값으로 정렬합니다. 또한 유틸리티를 사용하여 결과를 행으로 제한할 수 있습니다.-lsls -alfindsort|nhead

"Brainz를 사용한다"는 것은 "사람"을 읽고 오프라인에서 직접 솔루션을 검색할 수 있게 하여 처음부터 문제를 해결하도록 훈련시키는 것입니다. :-)

답변4

또한스티븐 차제라스' 답글, 다음 메모를 추가하고 싶습니다(댓글을 달 수 없습니다):

  1. 가장 작은 일반 파일을 얻으려면 o대신 다음을 사용하십시오 O.
ls -ld -- **/*(.DoL[1])
  1. 와일드카드에 특정 확장자를 추가하여 필터링할 수 있습니다 **/*.
ls -ld -- **/*.png(.DoL[1])
ls -ld -- **/*.{png, jpg}(.DoL[1]) # this will give two results, one per extension

관련 정보