![수천 개의 파일이 포함된 대규모 디렉토리를 검색하는 방법은 무엇입니까?](https://linux55.com/image/150692/%EC%88%98%EC%B2%9C%20%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%8C%80%EA%B7%9C%EB%AA%A8%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC%20%EA%B2%80%EC%83%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
폴더 아래
/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache
우리는 100개 이상의 재귀 폴더를 가지고 있습니다.
폴더 중 하나에는 수천 개의 파일이 포함되어 있습니다. 이 폴더를 인식할 수 있나요?
이 폴더에는 수천 개의 파일이 포함되어 있고 수천 개의 파일이 있는데 그 안에 있는 파일을 삭제할 수 없기 때문에 문제가 발생할 수 있기 때문에 이렇게 묻는 것입니다.
답변1
디렉토리의 항목 수는 다음을 사용하여 계산할 수 있습니다.
set -- *
이는 위치 매개변수( 등)를 현재 디렉토리의 이름 $1
으로 설정합니다. $2
확장된 이름 수는 *
에서 확인할 수 있습니다 $#
. bash
쉘을 사용 하고 dotglob
쉘 옵션을 설정하면 숨겨진 이름이 추가로 평가됩니다.
/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache
1000개 이상의 이름이 포함된 디렉토리를 찾으려면 다음을 사용하십시오 .
find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache \
-type d -exec bash -O dotglob -c '
for pathname do
set -- "$pathname"/*
if [ "$#" -gt 1000 ]; then
printf "%d\t%s\n" "$#" "$pathname"
fi
done' bash {} +
이는 *
발견된 각 디렉토리의 쉘 glob을 확장하고 디렉토리에 1000개 이상의 이름이 있는 경우 이름 수와 함께 디렉토리의 경로 이름을 인쇄합니다. 이는 bash
대량 디렉토리에 대한 짧은 스크립트를 실행하여 수행됩니다. 스크립트는 각 디렉터리 배치를 반복하고, 각 디렉터리에 대해 *
그 안에 있는 glob을 확장하여 항목 수를 계산합니다. 해당되는 경우 if
명령문이 트리거됩니다 printf
.
디렉토리에백만*
이름이 다르므로 해당 디렉터리에서 실제로 glob을 확장하는 데 시간이 걸릴 수 있습니다.
답변2
GNU 시스템에서
(export LC_ALL=C
find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -print0 |
tr '\n\0' '\0\n' |
sed 's|/[^/]*$||' |
sort |
uniq -c |
sort -rn |
head |
tr '\z' '\n')
항목이 가장 많은 10개의 디렉토리가 나열됩니다.
디렉토리에 파일이 너무 많고 나열하는 것조차 비용이 많이 든다면, 파일을 입력하지 않고 크기만 보고 추측해 볼 수 있습니다.
find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -type d \
-size +10000000c -print -prune
10MB보다 큰 디렉터리는 나열되며 입력되지 않습니다.