특정 개수의 파일이 포함 된 디렉토리 찾기


12

find명령 으로이 작업을 수행 할 수 있기를 희망 했지만 매뉴얼에서 원하는 작업을 수행하는 데 대한 테스트는 볼 수 없습니다. 작업 디렉토리에서 지정한 개수보다 적거나 많거나 정확하게 포함 된 디렉토리를 찾을 수 있기를 원합니다.

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries

그러나 슬프게도 그러한 옵션은 없습니다.


"ls -al | wc -l | grep"과 같은 것을 시도해보십시오
Vanadis

답변:


16

하위 디렉토리 이름과 여기에 포함 된 파일 / 디렉토리 수를 얻기 위해이를 시도 할 수 있습니다.

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

모든 하위 디렉토리에 대해 동일한 작업을 수행하려면 (재귀 찾기) 대신 다음을 사용하십시오.

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

정확히 10 개의 파일이있는 디렉토리를 선택하려면 다음을 수행하십시오.

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10 이상 :

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10 이하

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

디렉토리 이름 만 유지하려면 (예 : @evilsoup이 제안한대로 다른 프로세스 다운 스트림으로 파이프하려는 경우) 다음을 사용할 수 있습니다.

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'

1
질문자가 출력을 다른 것으로 파이프하려는 경우 파일 수 (예 : 마지막 공백으로 구분 된 열)를 차단하기 위해 awk 명령을 포함시키는 것이 유용 할 수 있다고 생각합니다.
evilsoup

1
@evilsoup 좋은 생각, 완료.
terdon

디렉토리 이름에 공백과 특수 문자를 지원합니다. 작은 따옴표와 큰 따옴표의 사용법을 반대로 find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
바꾸어보십시오

3

정확히 $NUM 파일을 포함하는 즉각적인 하위 디렉토리를 나열 합니다.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

보다$NUM파일을 포함하는 즉각적인 하위 디렉토리를 나열 합니다.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'

보다 적은$NUM 파일을 포함하는 즉각적인 하위 디렉토리를 나열 합니다.

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'

항목은 널 문자로 끝나 \0므로 줄 바꿈 또는 다른 유형의 공백이 포함 된 파일 이름은 올바르게 해석됩니다. %h인쇄 각 파일의 dirname. awk그런 다음 배열을 사용하여 각 디렉토리에서 발생하는 횟수를 세고 조건이 충족되면 인쇄합니다.

위에서 언급 한 명령은 파일이없는 디렉토리를 표시하지 않습니다. 또한 파일로 링크, 디렉토리, 소켓, 블록, 명명 된 파이프 등이 아닌 일반 파일을 참조하고 있습니다 .

가능한 한 간단 하게이 작업을 시도했습니다. 재귀 서브 디렉토리 또는 파일을 찾으려면 수정 된 명령이 필요합니다. 그것들을 모두 나열하기에는 너무 많은 가능성이 있습니다.


2

이 시도:

[`찾기. | wc -l` -eq 10] && echo "발견 된"

[`찾기. | wc -l` -gt 10] && echo "발견 된"

[`찾기. | wc -l` -lt 10] && echo "발견 된"

이 예에서 CURRENT 디렉토리에 정확히 10 개 이상, 10 개 이하의 파일 / 디렉토리가 포함되어 있는지 확인할 수 있습니다. 여러 디렉토리를 확인해야하는 경우 루프를 사용하십시오.


솔루션은 현재 디렉토리 ( .) 도 계산하므로 그에 따라 수정할 수 있습니다.
terdon

나는이 답변의 추력을 좋아하지만 (쉘에서 일을하기위한 열성이기 때문에) 불필요한 호출 을 피하기 위해 테스트를 사용 wc -l < <(printf %s\\n ./*)하거나 printf %s\\n ./* | wc -l테스트 하는 것이 좋습니다 find. 이것은 또한 @terdon .이 결과 에 포함시키는 문제를 피할 것 입니다. 그러나 또한 .;로 시작하는 파일을 무시하는 문제가 발생합니다 . 나는 함께이 문제를 해결 것 shopt -s dotglob(globs와 일치하는 파일이로 시작하게하는 .,하지만 ...).
evilsoup

@terdon 중요하지 않습니다. 최종 해결책이 아니라 단지 예입니다. 최종 버전에서는 -1을 사용하거나 10을 11로 변경할 수 있습니다.
9 월

나는 알고 있으며 아이디어가 좋기 때문에 내가 제안한 이유입니다.
terdon

@ 테르 돈. 감사합니다. 다음과 같은 여러 가지 요구 사항이있을 수 있습니다. 파일 만 계산하지만 디렉토리, 링크 또는 하드 링크는 제외합니다. 하위 디렉토리의 파일 수를 계산합니다. 숨겨진 파일 (예 : .bashrc)을 세어보세요. :)
9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.