디렉토리 수 계산

디렉토리 수 계산

전체 디렉터리 하위 트리에서 이름이 "lib"로 시작하는 여러 디렉터리를 인쇄하려면 스크립트나 명령이 필요합니다. 이 작업을 수행하기 위해 find, grep 및 wc를 사용하려고 시도했지만 모든 디렉토리를 검색할 수는 없었습니다. 어떻게 하나요?

답변1

find . -type d -name lib\* -exec echo x \; | wc -l

답변2

LC_ALL=C find .//. -name 'lib*' -type d | grep -c //

find . | wc -l줄 바꿈이 포함된 파일 경로가 있으면 제대로 작동하지 않으므로 사용할 수 없습니다 .

그렇지 않으면 LC_ALL=C다음으로 시작하지만 lib이름의 나머지 부분에 유효한 문자를 형성하지 않는 바이트가 포함된 디렉터리 이름은 평가되지 않을 수 있습니다.

그리고 zsh:

(){echo $#} **/lib*(DN/)

답변3

모든 lib디렉토리에 일반 이름이 있고 줄 바꿈이나 기타 이상하고 이국적인 문자가 없다고 가정합니다.

find / -type d -name "lib*" -print | wc -l

이는 "전체 디렉토리 하위 트리"가 "어디든지"를 의미한다고 가정합니다. 현재 디렉터리 또는 다음 디렉터리 만 /계산 하도록 변경합니다..

find명령은 이름이 ( )로 시작하는 모든 디렉터리( )를 찾아서 -type d인쇄합니다( ).lib-name "lib*"-print

계산 될 wc -l출력의 행 수입니다 find.

답변4

globstar다음은 쉘 옵션을 사용하는 bash 전용 솔루션입니다 .

$ shopt -s globstar; c=0; for f in ** ; do echo "${f##*/}"; [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]  && ((c++)); done ; echo $c

또는 더 나은 가독성을 위해 스크립트 형식으로 사용합니다.

#!/usr/bin/env bash
shopt -s globstar 
c=0
for f in **
do 
    echo "${f##*/}"
    if [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]
    then 
        ((c++))
    done
echo $c

globstar재귀 와일드카드를 활성화하고 이것이 [[패턴 일치 및 플래그를 통해 -d디렉터리인지 확인할 수 있도록 카운터 변수를 증가시키고 $c마지막으로 해당 변수를 인쇄합니다.

관련 정보