태그 보관물: inode

inode

파일이 많은 디렉토리 찾기 만 개의

그래서 내 고객이 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아이 노드에 대한은?



답변

/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가장 큰 범죄자를 알려줄 것입니다.


답변

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

#!/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 % 확실한 결과를 얻으려면 루트 권한으로이 스크립트를 실행하십시오.

최고 비즈니스 폴더


답변

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

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

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


답변

또 다른 제안 :

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는 사람이 읽을 수있는 형식으로 각 파일의 크기를 인쇄하므로 특히 유용합니다.


답변

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

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


답변

나는 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}'

답변