특정 이름을 가진 디렉토리의 파일 수 계산

특정 이름을 가진 디렉토리의 파일 수 계산

여기서 이 코드를 찾았어요https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html그러면 내 디렉토리에 있는 파일 수를 정확하게 알 수 있습니다.

ls -1 | wc -l

하지만 해당 파일 이름 중 2009로 시작하는 파일 이름이 몇 개인지 알고 싶습니다(예 20091210_005037.nc: ).

시도해 보았지만 ls -1 | wc -l 2009*모든 파일이 천천히 나열되고 숫자가 표시되지 않는 것 같습니다.

답변1

set -- 2009*
echo "$#"

$1그러면 위치 매개변수( , , ... 등) 목록이 $2일치하는 이름으로 설정됩니다 2009*. 이 목록의 길이는 입니다 $#.


문제는 일치하는 파일에서 직접 ls -1 | wc -l 2009*실행하여 각각의 줄 수를 세는 것입니다. 한편 에서는 작업할 파일의 명시적 목록이 제공되었기 때문에 읽을 수 없는 의 표준 입력에 쓰려고 합니다 .wc -l2009*ls -1wcwc

를 사용하고 싶었을 수도 있습니다 ls -d 2009* | wc -l. 그러면 일치하는 모든 이름이 나열되고 2009*( 디렉토리 내용을 나열하지 않으려면 lswith를 사용 -d) 출력의 줄 수를 계산합니다. 어딘가 -1의 결과를 파이프하는 경우에는 필요하지 않습니다 ( lsls출력을 강제하는 별칭이나 셸 함수가 아닌 경우).

또한 이것은 당신에게잘못된파일 이름에 개행 문자가 포함되어 있으면 계산됩니다.

$ touch '2009
> was
> a
> good
> year'
$ ls
2009?was?a?good?year
$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 May 28 11:09 2009?was?a?good?year
$ ls -1
2009?was?a?good?year
$ ls | wc -l
       5
$ ls -1 | wc -l
       5

하지만:

$ set -- 2009*
$ echo "$#"
1

(추가로 사용 set하고 출력하는 것은 $#대부분의 쉘에서 외부 명령을 사용하지 않습니다)


재귀적으로 계산하는 데 사용 find:

find . -type f -name '2009*' -exec echo . \; | wc -l

여기서는 현재 디렉터리 안이나 아래에서 발견된 각 경로 이름에 대해 점을 출력한 다음 생성되는 줄 수를 계산합니다. 우리는 파일 이름 문자열 자체를 계산하지 않고 대신 파일 이름에 개행 문자가 포함된 경우 너무 많은 줄을 계산하지 않도록 이 방법을 사용합니다.

우리 find유형우리가 계산하는 파일의 수입니다. 위에서는 명시적으로 테스트합니다.일반 파일( 즉 -type f, 디렉토리나 다른 유형의 파일이 아님) *셸의 패턴은 디렉터리와 파일을 구분하지 않지만 셸 은 일반 파일만 일치하도록 패턴의 동작을 수정하는 데 zsh사용할 수 있습니다 ( 사용자는 아마도 위와 아래의 비 변형 대신 사용할 것입니다).*(.)zsh2009*(.)2009*find

**in ( shopt -s globstarin bash, set -o extended-globin yash또는 이를 지원할 수 있는 다른 셸에서)을 사용하여 재귀적으로 계산합니다.

set -- **/2009*
echo "$#"

패턴은 **거의 유사하게 일치 *하지만 /경로 이름에서도 across 와 일치합니다.

답변2

아래 명령으로 시도했는데 제대로 작동하고 결과를 얻었습니다.

   find . -maxdepth 1 -type f -iname "2009*" | awk '{print NR}'| sed -n '$p'

참고: 하위 디렉터리 아래에도 적용하려면 maxlength 옵션을 제거하세요.

답변3

댓글을 주신 분들께 감사드립니다. 제 질문에 대한 답변은 다음과 같습니다.

ls 2009* | wc -l

또는 찾기를 사용하여

find 2009* | wc -l

답변4

awk를 사용하여 특정 파일 이름으로 시작하는 파일 수를 계산합니다.

root@ubuntu$ find . -name "2009*" | awk 'BEGIN{total=0}; {total=total+1} END {print "total files starting with 2009 is " ,total}'
total files starting with 2009 is  4

관련 정보