내 서버의 총 파일 수를 알고 싶습니다. 이것이 가능합니까?
답변1
구체적으로 계산하려는 내용에 따라 다음을 수행하는 것이 더 나을 수도 있습니다.파일 시스템당루트 디렉터리의 모든 파일을 계산하는 대신. 루트 아래의 모든 항목을 계산하면 포함하고 싶지 않은 파일도 계산됩니다 /proc
./sys
GNU를 사용하여 루트 파일 시스템의 모든 것을 계산하려면 find
다음을 수행할 수 있습니다.
find / -xdev -type f -printf '\n' | wc -l
-printf '\n'
파일 이름이 아닌 찾은 각 파일에 대해 개행 문자만 인쇄합니다 . 이렇게 하면 개행 문자가 포함된 파일 이름 자체가 문제를 일으키지 않으며 여러 파일로 처리됩니다.
POSIX find를 사용하면 다음을 간단히 수행할 수 있습니다.
find / -xdev -type f | wc -l
또는 POSIXly로 개행 문자가 포함된 파일이 두 번 계산되는 것을 방지하세요.
{ printf 0; find / -xdev -type f -exec sh -c 'printf "+ $#"' sh {} +; echo; } | bc
여기에서는 각 파일이 서로 다른 매개변수가 되어 sh
전체 매개변수 개수가 인쇄됩니다. 여러 프로세스가 호출되는 경우 sh
(파일이 많은 경우) 각 sh
출력은 bc
.
고쳐 쓰다
더 간단하지만 느린 POSIX 솔루션:
find / -xdev -type f -exec printf '%s\0' {} + | tr '\n\0' '?\n' | wc -l
업데이트 2
지적한대로@길스, 일반 파일만 계산하려면 -type f
with를 사용하세요. find
장치 파일도 포함하려면 를 사용할 수 있습니다 -type f -o -type b -o -type c
. 디렉터리를 계산하려면 옵션을 사용하지 마세요 -type
.
Gilles의 또 다른 요점은 여러 개의 하드 링크가 있는 파일이 다른 파일로 처리된다는 것입니다. 예를 들어, 최신 트리의 변경되지 않은 파일을 이전 트리의 파일에 하드 링크하여 증분 백업 트리가 생성되는 파일 시스템에서는 이것이 이상적이지 않을 수 있습니다. GNU 도구를 사용하여 이 문제를 극복하려면 다음을 수행할 수 있습니다.
find / -xdev -type f -printf '%i\n' | sort -u | wc -l
POSIX 도구 사용:
find / -xdev -type f -exec ls -iq {} + | sort -buk 1,1 | wc -l
-q
옵션은 파일 이름 ls
이 ?
.
답변2
df -i /
당신이 사용할 수량인덱스 노드루트 파일 시스템(ext2/ext3/ext4 계열을 포함하여 inode를 사용하는 파일 시스템(btrfs는 제외)). 이는 파일 시스템의 파일 수와 사용을 위해 사전 할당된 일부 inode 수입니다.FSCK.
디렉토리 트리의 파일 수를 원할 경우 다음 명령을 사용할 수 있습니다.
du -a /some/directory | wc -l
마운트 지점을 순회하지 않으려면 이 옵션을 추가하세요 -x
. 파일 이름에 개행 문자가 포함되어 있으면 더 큰 개수가 반환됩니다(나쁜 생각이지만 불가능하지는 않습니다).du
du -ax / | wc -l
계산하는 또 다른 방법은
find /some/directory | wc -l
또는 개행 문자가 포함된 파일 이름을 처리하려면 GNU find(비포함 Linux 또는 Cygwin)를 사용하십시오.
find /some/directory -printf . | wc -c
마운트 지점을 건너뛰려면 -xdev
(예 : )을 추가하세요 . find /some/directory -xdev -printf .
이것은 파일이 아닌 디렉토리 항목입니다. 파일에 여러 개의 하드 링크가 있는 경우 각 링크가 계산됩니다(반면 df
및 du
메소드는 파일을 계산합니다. 즉, 동일한 파일에 대한 여러 하드 링크는 한 번만 계산됩니다).
답변3
고쳐 쓰다
이것이 완전히 이식 가능하다고 상상할 수 있는 가장 빠른 방법입니다. tar
아래 방법은 하드 링크 파일을 한 번만 자동으로 추가하기 때문에 사용합니다 .
find /./ -xdev ! -type d | tar -cf - - | tar -t | sed -n '\|^/\./|c.' | wc -l
휴대성이 뛰어나고 매우 빠릅니다.
find / -xdev | sed -n '/^[./]/c\.' | wc -l
나는 실제로 나머지가 모두 필요하다고 생각하지 않습니다. 아래의 누락 가능성에 대해서는 @Graeme이 옳습니다. 그러나 여기에는 동일한 단점이 없습니다.
find /./ -xdev | sed -n '\|^/\./|c.' | wc -l
당신이 해야 할 일은 다른 모든 과정을 거치지 않고도 전체 루트 경로가 있는지 확인하는 것뿐입니다.
노트:Giles가 지적했듯이-f 유형심각한 실수입니다. 이를 반영하기 위해 이 게시물을 업데이트했습니다.
또한 보다 정확한 계산을 위해 다음을 수행하면 됩니다.
du / --inodes -xs
도구가 최신인 경우 루트 파일 시스템의 정확한 파일 수를 제공합니다. 이는 모든 디렉터리에 사용할 수도 있습니다.
매우 일반적인 도구만 사용하여 모든 파일 시스템이나 하위 디렉터리에 있는 모든 파일(하드 링크 제외)의 정확한 개수를 얻는 방법은 다음과 같습니다. 먼저away를 사용하여 대상 루트를 격리합니다 mount --bind
.
mkdir /tmp/ls ; sudo mount -B / $_ ; cd $_
다음으로 파일 수를 계산합니다.
sudo ls -ARUi1 ./ |
grep -o '^ *[0-9]*' |
sort -un |
wc -l
나는 이것과 아주 비슷한 일을했다또 다른 대답며칠 전만 해도 이것은 약간 복잡했습니다. 목표는 가장 높은 파일 수가 포함된 하위 디렉터리를 기준으로 정렬하는 것이기 때문입니다. 따라서 거기에 있는 명령은 여기의 명령과 약간 다르게 보입니다. 하지만 그건 그렇고, 이것은 여전히 매우 빠릅니다.
어쨌든 핵심은 ls
명령에 관한 것입니다. -Recursively
전체 트리를 검색하여 한 줄에 하나의 파일을 나열합니다 . 그런 다음 -Almost-all -inodes -Unsorted
inode를 확인하고-1
grep -only
[0-9]numbers, sort
-unique -numbers
wcount -lines.
답변4
루트 디렉터리에서:
find . -type f | wc -l
파일 수를 계산하려는 디렉터리로 경로(여기)를 변경할 수 있습니다. 하위 디렉터리로 이동하지 않으려면 옵션을 추가하세요.-maxdepth 1