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

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

여기서 이 코드를 찾았어요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*( 목록을 나열 ls하지 않고 디렉터리의 내용을 사용하여 -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 "$#"

패턴은 **과 거의 일치 *하지만 경로 이름과도 교차 일치합니다 /.

답변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

관련 정보