재귀적으로 디렉터리에서 가장 큰 파일을 찾으려고 합니다. 디렉터리 내에 하위 디렉터리가 있는 경우 함수는 디렉터리로 이동하여 가장 큰 파일이 있는지 확인해야 합니다. 가장 큰 파일을 찾으면 상대 경로 이름과 가장 큰 파일의 이름 및 크기가 포함된 출력이 표시됩니다.
전임자:
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
파일 경로에 개행 문자가 포함되어 있지 않다고 가정합니다.
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"
이는 해결책을 찾는 것보다 훨씬 느립니다. 이는 또한 파일 이름이 개행 문자로 끝나지 않고 숨겨진 파일을 건너뛰고 숨겨진 디렉터리가 입력되지 않는다고 가정합니다.
호출되는 현재 디렉토리에 파일이 있는 경우 -
표준 입력에서 열려 있는 파일의 크기가 고려됩니다.
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 -k7
7번째 필드가 정렬 매개변수 값으로 사용됨을 나타냅니다. 매개변수는 공백으로 구분됩니다. 7번째 매개변수는 유틸리티에 의해 생성된 파일의 크기입니다find
.-exec ls -al {} \;
대신 사용하는 경우-ls
다섯 번째 필드를 사용하여-k5
정렬하게 됩니다.-r
sort
가장 큰 것을 먼저 배치하여 역 정렬을 사용하도록 지시합니다 . 왜냐하면 우리는 가장 큰 파일을 먼저 보고 싶기 때문입니다.- 또한 수백 줄을 실제로 보고 싶지 않은 경우
|
정렬된 출력을head
지침에 따라 결과 출력의 처음 세 줄만 표시하는 유틸리티로 파이프할 수도 있습니다.-n 3
간단히 말해서: 일반 파일을 재귀적으로 찾는 데 사용됩니다. 현재 작업 디렉터리에서만 검색을 시작한 다음 확장자(또는 실행)를 사용하여 find
파일에 대한 전체 정보를 표시합니다. 나중에 Unix 파이프를 사용하여 결과를 에 전달하고 먼저 7번째(또는 5번째) 필드를 기준으로 가장 큰 값으로 정렬합니다. 또한 유틸리티를 사용하여 결과를 행으로 제한할 수 있습니다.-ls
ls -al
find
sort
|
n
head
"Brainz를 사용한다"는 것은 "사람"을 읽고 오프라인에서 직접 솔루션을 검색할 수 있게 하여 처음부터 문제를 해결하도록 훈련시키는 것입니다. :-)
답변4
또한스티븐 차제라스' 답글, 다음 메모를 추가하고 싶습니다(댓글을 달 수 없습니다):
- 가장 작은 일반 파일을 얻으려면
o
대신 다음을 사용하십시오O
.
ls -ld -- **/*(.DoL[1])
- 와일드카드에 특정 확장자를 추가하여 필터링할 수 있습니다
**/*
.
ls -ld -- **/*.png(.DoL[1])
ls -ld -- **/*.{png, jpg}(.DoL[1]) # this will give two results, one per extension