
전체 디렉터리 하위 트리에서 이름이 "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
마지막으로 해당 변수를 인쇄합니다.