n번째 하위 디렉터리 깊이 및 파일 수에 액세스

n번째 하위 디렉터리 깊이 및 파일 수에 액세스

cd 명령과 ls를 사용하여 UNIX 시스템의 트리를 루트 "/"에서 시작하는 2개의 하위 디렉터리 깊이로 설정합니다. 파일 또는 디렉터리 수가 20보다 크면 파일 또는 하위 디렉터리 수만 지정됩니다.

지금까지 나는 다음을 시도했습니다.

cd /../.. | ls -l | wc -l

하지만 이것이 내 요구 사항을 충족할지는 잘 모르겠습니다. 나는 화장실을 안다. 파일 수를 계산할 수 있지만 알 수 없습니다. cd/../../왜냐하면 2층 아래로 내려가는 것 같거든요. 글쎄, 혼란스러워 보인다.

답변1

당신의 주문은 아무 의미가 없습니다. 첫째, cd /../..와 동일합니다 cd /. 즉, 현재 작업 디렉터리를 디렉터리 계층 구조의 최상위 디렉터리로 변경합니다. 둘째, cd출력이 생성되지 않으므로 다음으로 파이프됩니다.아무것좋은 일은 없을 것입니다.

셋째, ls -l현재 디렉터리의 항목(이름) 목록이 생성됩니다. wc -l다음을 사용하여 수량을 계산하고 있습니다 .철사출력에서 ls -l. 이 숫자는 ls -l일종의 헤더가 출력되기 때문에 임의의 디렉토리에 있는 실제 디렉토리 항목 수보다 적어도 하나 더 많을 것입니다 (BSD는 ls이를 수행하지 않음).비어 있는디렉토리에 있지만 GNU는 ls항상 이렇게 합니다). ls -l~ 할 것이다아니요숨겨진 파일 이름을 나열하고 (에 파이프될 때 wc -l) 생성 됩니다.여러 줄파일 이름에 줄 바꿈이 포함된 파일의 경우.

ls디렉토리 목록을 보는 것(눈으로) 이외의 목적으로 사용하지 말고 wc -l계산 용으로만 사용하십시오.철사. 파일 개수를 계산하는 더 스마트하고 빠른 방법이 있습니다.

관련된:


모든 두 번째 수준 하위 디렉터리의 디렉터리 항목(이름) 수를 나열하려면 bash다음과 같이 사용하세요.

shopt -s nullglob dotglob

for dirpath in /*/*/; do
    set -- "$dirpath"/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

이는 모든 보조 디렉터리를 통해 반복됩니다. 각 디렉터리에 대해 *디렉터리의 와일드카드 패턴을 확장 하고 위치 인수를 결과 이름으로 설정합니다. 이 작업을 수행하면 특수 변수에 $#위치 매개변수(디렉토리의 이름) 수가 포함됩니다. 그런 다음 해당 개수와 함께 디렉터리 경로 이름을 인쇄합니다.

nullglobdotglob먼저 숨겨진 이름을 올바르게 계산하고 빈 디렉터리의 올바른 수(0)를 얻을 수 있도록 및 쉘 옵션을 설정합니다 .

레벨 2의 각 하위 디렉터리를 재귀적으로 계산하시겠습니까?

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

globstar의 쉘 옵션을 사용하면 하위 디렉토리와 "재귀적으로" 일치하는 패턴을 bash사용할 수 있습니다.**

20개 이상의 항목이 있는 항목만 나열하시겠습니까(여기서는 각 하위 디렉터리에서 이름을 재귀적으로 계산하는 위의 두 번째 변형을 사용함):

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    if [[ $# -ge 20 ]]; then
        printf '%d\t%s\n' "$#" "$dirpath"
    fi
done

관련 정보