파일이 많은 디렉토리 찾기


33

그래서 내 고객이 Linode로부터 오늘 서버로 인해 Linode의 백업 서비스가 중단되었다는 이메일을 받았습니다. 왜? 파일이 너무 많습니다. 나는 웃으면 서 달렸다.

# df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/xvda        2.5M  2.4M   91K   97% /

쓰레기. 240 만 개의 inode가 사용 중입니다. 도대체 무슨 일이야?!

나는 명백한 용의자 ( /var/{log,cache}및 모든 사이트가 호스팅되는 디렉토리)를 찾았지만 실제로 의심스러운 것을 찾지 못했습니다. 이 짐승의 어딘가에 2 백만 개의 파일이 들어있는 디렉토리가 있다고 확신합니다.

문맥 상 나의 바쁜 서버는 200k inode를 사용하고 내 데스크탑 (사용 된 스토리지가 4TB 이상인 오래된 설치)은 백만 이상에 불과합니다. 문제가 있습니다.

내 질문은 문제가 어디에 있는지 어떻게 알 수 있습니까? 거기에 du아이 노드에 대한은?



1
vmstat -1 100을 실행하고 그 중 일부를 보여주십시오. CS (컨텍스트 전환)에서 많은 수를주의하십시오. 때때로 실패한 파일 시스템은 많은 inode를 오류로 풀어 놓을 수 있습니다. 또는 합법적으로 많은 파일이 있습니다. 이 링크는 파일 및 inode에 대해 알려줍니다. stackoverflow.com/questions/653096/howto-free-inode-usage lsof 명령으로 무엇이 실행 / 열렸는지 확인할 필요가 있습니다.
j0h

답변:


23

/lost+found디스크 문제가 있고 많은 정크가 별도의 파일로 감지되어 잘못되었을 수 있는지 확인하십시오 .

iostat일부 응용 프로그램이 여전히 미친 파일을 생성하는지 확인 하십시오.

find / -xdev -type d -size +100k100kB 이상의 디스크 공간을 사용하는 디렉토리가 있는지 알려줍니다. 그것은 많은 파일을 포함하거나 과거에 많은 파일을 포함하는 디렉토리입니다. 크기 그림을 조정하고 싶을 수도 있습니다.

나는 du디렉토리 항목 당 1을 세게하기 위해 GNU에 옵션의 조합이 있다고 생각하지 않습니다 . findawk로 계산하고 약간의 계산을 수행하여 파일 목록을 생성 하여이 작업을 수행 할 수 있습니다 . 여기 du에 inode가 있습니다. 최소한으로 테스트되었으며 줄 바꿈이 포함 된 파일 이름을 처리하려고 시도하지 않습니다.

#!/bin/sh
find "$@" -xdev -depth | awk '{
    depth = $0; gsub(/[^\/]/, "", depth); depth = length(depth);
    if (depth < previous_depth) {
       # A non-empty directory: its predecessor was one of its files
       total[depth] += total[previous_depth];
       print total[previous_depth] + 1, $0;
       total[previous_depth] = 0;
    }
    ++total[depth];
    previous_depth = depth;
}
END { print total[0], "total"; }'

사용법 : du-inodes /. 비어 있지 않은 디렉토리 목록과 그에 대한 총 항목 수 및 해당 서브 디렉토리를 재귀 적으로 인쇄합니다. 출력을 파일로 리디렉션하고 여가 시간에 검토하십시오. sort -k1nr <root.du-inodes | head가장 큰 범죄자를 알려줄 것입니다.


스크립트는 오류를 제공합니다 :awk: line 2: find: regular expression compile failed (bad class -- [], [^] or [) [^ awk: line 2: syntax error at or near ] `/tmp/tmpw99dhs': Permission denied
Radu Rădeanu

@ RaduRădeanu 아, 다른 버전에서는 작동하지 않는 색다른 특성을 사용했습니다. POSIX에 따라 필요한 백 슬래시를 추가했습니다.
Gilles 'SO- 악한 중지'

14

이 스크립트로 확인할 수 있습니다 :

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

echo "Wait a moment if you want a good top of the bushy folders..."

find "$@" -type d -print0 2>/dev/null | while IFS= read -r -d '' file; do 
    echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file"
done | sort -nr | head | awk '{print NR".", "\t", $0}'

exit 0

파일 개수별로 상위 10 개의 하위 디렉토리를 인쇄합니다. 당신은 상단의 X, 변경하려는 경우 headhead -n x, x0보다 큰 자연수 큰입니다.

100 % 확실한 결과를 얻으려면 루트 권한으로이 스크립트를 실행하십시오.

최고 비즈니스 폴더


2019 : 제기 10: read: Illegal option -d... 나쁜 일이 일어나지 않기를 바라고 -d깃발을 닦았 read습니다. 실행이 완료되면 알려 드리겠습니다 ...
Williams

3

찾기 데이터베이스가 최신 상태 인 경우 종종 찾기보다 빠릅니다.

# locate '' | sed 's|/[^/]*$|/|g' | sort | uniq -c | sort -n | tee filesperdirectory.txt | tail

이 명령은 전체 찾기 데이터베이스를 덤프하고 경로에서 마지막 '/'를 지나는 모든 항목을 제거한 다음 sort 및 "uniq -c"는 디렉토리 당 파일 / 디렉토리 수를 제공합니다. "sort -n"은 가장 많은 것을 가진 10 개의 디렉토리를 얻기 위해 파이프로 연결됩니다.


+1 : 찾기 데이터베이스를 사용하는 것이 좋습니다.
Max Beikirch

어떤 이유로 든 locate를 사용할 수없는 경우 find /path/to/parent -xdev > filelist먼저 sed를 실행하여 해당 목록에서 입력을 읽도록 지시하십시오.
gerrit

1

또 다른 제안 :

http://www.iasptk.com/20314-ubuntu-find-large-files-fast-from-command-line

이 검색을 사용하여 서버에서 가장 큰 파일을 찾으십시오.

1GB 이상의 파일 찾기

sudo 찾기 /-유형 f-크기 + 1000000k -exec ls -lh {} \;

100MB가 넘는 파일 찾기

sudo 찾기 /-유형 f-크기 + 100000k -exec ls -lh {} \;

10MB가 넘는 파일 찾기

sudo 찾기 /-유형 f-크기 + 10000k -exec ls -lh {} \;

첫 번째 부분은 "-size"플래그를 사용하여 킬로바이트 단위로 측정 된 다른 크기의 파일을 찾는 find 명령입니다.

"-exec"로 시작하는 마지막 비트는 찾은 각 파일에서 실행할 명령을 지정할 수 있습니다. "ls -lh"명령은 디렉토리의 내용을 나열 할 때 표시되는 모든 정보를 포함합니다. 끝에있는 h는 사람이 읽을 수있는 형식으로 각 파일의 크기를 인쇄하므로 특히 유용합니다.


2
그의 문제는 높은 inode 사용량으로, 큰 파일이 아닌 많은 작은 파일을 가리 킵니다.
UpTheCreek 2016 년

0

이것은 쉘을 통해 다른 사람이 Android에서 실패했을 때 나를 위해 일했습니다.

find / -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr | head -n25

0

나는 du --inodes -d 1재귀 적으로 또는 많은 파일을 직접 포함하는 디렉토리를 찾는 것과 같은 것을 사용하고 싶다 .

나는 또한이 대답을 좋아합니다 : https://unix.stackexchange.com/a/123052

우리의 게으른 사람에게는 여기에 요점이 있습니다.

du --inodes -S | sort -rh | sed -n \
    '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.