재귀 적으로 가장 큰 파일 찾기 in *; do

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

전의:

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

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



답변

파일 크기를 가진 파일 이름을 출력 하려면 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 이전의 버전은 디렉토리 트리를 내릴 때 기호 링크를 따랐다 는 점에 유의하십시오 .


답변

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

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

답변

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

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

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


답변

zsh, 가장 큰 일반 파일 :

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

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

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

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

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