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
이는 모든 보조 디렉터리를 통해 반복됩니다. 각 디렉터리에 대해 *
디렉터리의 와일드카드 패턴을 확장 하고 위치 인수를 결과 이름으로 설정합니다. 이 작업을 수행하면 특수 변수에 $#
위치 매개변수(디렉토리의 이름) 수가 포함됩니다. 그런 다음 해당 개수와 함께 디렉터리 경로 이름을 인쇄합니다.
nullglob
dotglob
먼저 숨겨진 이름을 올바르게 계산하고 빈 디렉터리의 올바른 수(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