특정 확장자를 가진 파일과 그 안에있는 디렉토리를 어떻게 셀 수 있습니까?


14

.c큰 복잡한 디렉토리 구조에 확장명이있는 일반 파일 수 와이 파일이 얼마나 많은 디렉토리 에 있는지 알고 싶습니다 . 내가 원하는 결과는 그 두 숫자입니다.

파일 수를 얻는 방법에 대한 이 질문을 보았지만 파일도있는 디렉토리 수를 알아야합니다.

  • 내 파일 이름 (디렉토리 포함)에는 문자가있을 수 있습니다. 공백으로 시작 .하거나 -공백이나 줄 바꿈이있을 수 있습니다.
  • 이름이으로 끝나는 일부 심볼릭 .c링크와 디렉토리에 대한 심볼릭 링크가있을 수 있습니다 . 심볼릭 링크를 따르거나 계산하고 싶지 않거나 적어도 언제 링크되는지 계산하고 싶습니다.
  • 디렉토리 구조에는 여러 레벨이 있으며 최상위 디렉토리 (작업 디렉토리)에는 하나 이상의 .c파일이 있습니다.

나는 (Bash) 쉘에 명령을 직접 써서 직접 계산했지만 결과가 정확하다고 생각하지 않습니다 ...

shopt -s dotglob
shopt -s globstar
mkdir out
for d in **/; do
     find "$d" -maxdepth 1 -type f -name "*.c" >> out/$(basename "$d")
done
ls -1Aq out | wc -l
cat out/* | wc -l

이렇게하면 모호한 리디렉션에 대한 불만 사항이 출력되고 현재 디렉토리의 파일이 누락되고 특수 문자 (예 : 리디렉션 된 find출력이 파일 이름에 줄 바꿈을 인쇄 함)를 넘어서고 빈 파일 (oops) 전체를 씁니다.

.c파일과 해당 디렉토리를 확실하게 열거하려면 어떻게 해야합니까?


도움이되는 경우 나쁜 이름과 심볼릭 링크로 테스트 구조를 만드는 명령이 있습니다.

mkdir -p cfiles/{1..3}/{a..b} && cd cfiles
mkdir space\ d
touch -- i.c -.c bad\ .c 'terrible
.c' not-c .hidden.c
for d in space\ d 1 2 2/{a..b} 3/b; do cp -t "$d" -- *.c; done
ln -s 2 dirlink
ln -s 3/b/i.c filelink.c

결과 구조에서 7 개의 디렉토리에는 .c파일이 포함되어 있으며 29 개의 일반 파일은 .c( dotglob명령을 실행할 때 꺼져있는 경우 )로 끝납니다 (잘못 계산 한 경우 알려주십시오). 이들은 내가 원하는 숫자입니다.

주시기 바랍니다 없는 이 특정 테스트를 사용합니다.

주의 : 어떤 쉘이나 다른 언어로 된 답변은 나에 의해 테스트되고 평가 될 것입니다. 새 패키지를 설치해야한다면 문제 없습니다. GUI 솔루션을 알고 있다면 공유하는 것이 좋습니다 (그러나 전체 DE를 설치하여 테스트하지는 않을 수도 있습니다) :) Ubuntu MATE 17.10을 사용합니다.


나쁜 프로그래밍 습관을 다루는 프로그램을 작성하는 것은 매우 어려운 것으로 판명되었습니다.)
— WinEunuuchs2Unix

답변:


16

심볼릭 링크로 출력을 검사하지는 않았지만 다음과 같습니다.

find . -type f -iname '*.c' -printf '%h\0' |
  sort -z |
  uniq -zc |
  sed -zr 's/([0-9]) .*/\1 1/' |
  tr '\0' '\n' |
  awk '{f += $1; d += $2} END {print f, d}'
  • 이 find명령은 .c찾은 각 파일 의 디렉토리 이름을 인쇄합니다 .
  • sort | uniq -c각 디렉토리에 몇 개의 파일이 있는지 알려줍니다 ( sort여기서는 불필요합니다)
  • 로 sed, 디렉토리 이름을 1로 바꿉니다. 따라서 가능한 모든 이상한 문자를 제거하고 카운트 만 1남습니다.
  • 줄 바꿈으로 구분 된 출력으로 변환 할 수 있습니다. tr
  • 그런 다음 총 파일 수와 해당 파일이 포함 된 디렉토리 수를 얻기 위해 awk와 요약합니다. 참고 d기본적으로 동일하다 여기 NR. 명령 삽입 1을 생략하고 여기에 sed인쇄 NR했지만 약간 더 명확하다고 생각합니다.

까지는 tr데이터가 NUL로 구분되어 모든 유효한 파일 이름으로부터 안전합니다.


zsh와 bash를 사용 printf %q하면 줄 바꿈이없는 인용 문자열을 얻을 수 있습니다 . 따라서 다음과 같은 작업을 수행 할 수 있습니다.

shopt -s globstar dotglob nocaseglob
printf "%q\n" **/*.c | awk -F/ '{NF--; f++} !c[$0]++{d++} END {print f, d}'

그러나 **디렉토리에 대한 심볼릭 링크를 확장 하지 않아도 bash 4.4.18 (1) (Ubuntu 16.04)에서 원하는 출력을 얻을 수 없습니다.

$ shopt -s globstar dotglob nocaseglob
$ printf "%q\n" ./**/*.c | awk -F/ '{NF--; f++} !c[$0]++{d++} END {print f, d}'
34 15
$ echo $BASH_VERSION
4.4.18(1)-release

그러나 zsh는 정상적으로 작동했으며 명령을 단순화 할 수 있습니다.

$ printf "%q\n" ./**/*.c(D.:h) | awk '!c[$0]++ {d++} END {print NR, d}'
29 7

D이 glob가 도트 파일을 .선택하고, 일반 파일 (심볼릭 링크가 아님)을 선택 :h하고 파일 이름이 아닌 디렉토리 경로 만 인쇄합니다 (예 : find' %h) ( 파일 이름 생성 및 수정 자 섹션 참조 ). 따라서 awk 명령을 사용하면 나타나는 고유 디렉토리의 수를 세면됩니다. 행 수는 파일 수입니다.


대단해. 필요한 것을 정확하게 사용합니다. 가르쳐 주셔서 감사합니다 :)
— 잔나

@Zanna 심볼릭 링크를 사용하여 디렉토리 구조를 다시 작성하고 심볼릭 링크를 사용하여 예상되는 출력을 다시 작성하는 명령을 게시하면이를 적절하게 수정할 수 있습니다.
— muru

심볼릭 링크를 사용하여 (평소와 같이 복잡하지 않은) 테스트 구조를 만들기 위해 몇 가지 명령을 추가했습니다.
— 잔나

@ 잔나 나는이 명령을 조정할 필요가 없다고 생각합니다 29 7. 에 추가 -L하면 find까지 올라갑니다 41 10. 어떤 출력이 필요합니까?
— muru

1
zsh + awk 메소드를 추가했습니다. zsh 자체가 나를 위해 카운트를 인쇄하도록하는 방법이 있을지 모르지만 방법은 모릅니다.
— muru April

11

파이썬은 os.walk개행 문자를 포함하는 이상한 파일 이름에도 불구하고 쉽고 직관적이며 자동으로 강력한 작업을 수행합니다. 내가 원래 chat에 게시 한이 Python 3 스크립트 는 현재 디렉토리에서 실행되도록 설계되었습니다 (그러나 현재 디렉토리 에 위치 할 필요는 없으며 전달하는 경로를 변경할 수 있습니다 os.walk).

#!/usr/bin/env python3

import os

dc = fc = 0
for _, _, fs in os.walk('.'):
    c = sum(f.endswith('.c') for f in fs)
    if c:
        dc += 1
        fc += c
print(dc, fc)

이름이로 끝나는 파일 .c, 공백으로, 이름이로 끝나는 파일 수를 하나 이상 포함하는 디렉토리 수를 직접 인쇄합니다 .c. "숨겨진"파일, 즉 이름이 시작하는 파일이 .포함되며 숨겨진 디렉토리도 비슷하게 탐색됩니다.

os.walk재귀 적으로 디렉토리 계층을 순회합니다. 사용자가 제공 한 시작점에서 재귀 적으로 액세스 할 수있는 모든 디렉토리를 열거하여 각 디렉토리에 대한 정보를 세 개의 값으로 구성 root, dirs, files됩니다. 각 디렉토리에 대해 트래버스합니다 (이름을 지정한 첫 번째 디렉토리 포함).

  • root해당 디렉토리의 경로 이름을 보유합니다. 이 시스템의 "루트 디렉토리"는 전혀 관련이 있습니다 /(그리고에도 관련이없는 /root이 있지만) 것입니다 당신이 시작하면 그로 이동합니다. 이 경우 root경로 ( .현재 디렉토리) 에서 시작하여 그 아래로 이동합니다.
  • dirs현재 이름이있는 디렉토리 의 모든 하위 디렉토리 경로 이름 목록을 보유합니다 root.
  • files이름이 현재 보유되어 있지만 디렉토리 자체가 아닌 디렉토리에있는 모든 파일 의 경로 이름 목록을 보유합니다 root. 여기에는 심볼릭 링크를 포함하여 일반 파일 이외의 다른 종류의 파일이 포함되지만 이러한 항목이 끝날 것으로 기대하지 않는 것으로 보입니다 .c.

이 경우에는 튜플의 세 번째 요소 files( fs스크립트에서 호출) 만 검사하면 됩니다. find명령 과 마찬가지로 파이썬 os.walk은 나를 위해 하위 디렉토리로 이동합니다. 내가 직접 검사해야 할 것은 각 파일에 포함 된 파일의 이름입니다. 그러나 find명령 과 달리 os.walk자동으로 해당 파일 이름 목록을 제공합니다.

이 스크립트는 기호 링크를 따르지 않습니다. 당신은 아주 아마 하지 않는 어떤주기가없는 경우에도, 같은 파일 및 디렉토리가 이송 될 수 있으며, 서로 다른 심볼릭 링크를 통해 액세스 할 수있는 경우 여러 번 계산 때문에 그들이 사이클을 형성 할 수 있기 때문에, 심볼릭 링크는 이러한 작업 수행을 위해 원하고.

만약 당신이 os.walk심볼릭 링크를 따르고 싶었다면 – 보통 은 그렇지 않을 것입니다 – 그리고 당신은 followlinks=true그것을 전달할 수 있습니다. 즉, 쓰는 대신 쓸 os.walk('.')수 있습니다 os.walk('.', followlinks=true). 크기와 상관없이 전체 디렉토리 구조를 재귀 적으로 열거하고 일부 요구 사항을 충족하는 모든 파일을 계산하는 것과 같은 작업의 경우 거의 원치 않을 것이라고 반복합니다.


7

찾기 + 펄 :

$ find . -type f -iname '*.c' -printf '%h\0' | 
    perl -0 -ne '$k{$_}++; }{ print scalar keys %k, " $.\n" '
7 29

설명

이 find명령은 일반 파일 (심볼릭 링크 또는 디렉토리가 없음)을 찾은 다음 ( %h) 에있는 디렉토리 이름과 그 뒤에 있는 디렉토리 이름을 인쇄합니다 \0.

  • perl -0 -ne: 한 줄씩 입력을 읽고 ( -n) -e각 줄에 지정된 스크립트를 적용하십시오 . -0세트 입력 라인 분리기하는 \0있으므로 구분 널 입력을 읽을 수있다.
  • $k{$_}++: $_현재 행의 값을 취하는 특수 변수입니다. 이것은 각 입력 라인 (디렉토리 이름)을 본 횟수 인 hash 의 키로 사용됩니다 %k.
  • }{: 이것은 짧은 쓰기 방법입니다 END{}. }{모든 입력이 처리 된 후 이후의 모든 명령이 한 번 실행됩니다.
  • print scalar keys %k, " $.\n": keys %k해시의 키 배열을 반환합니다 %k. scalar keys %k해당 배열의 요소 수, 표시되는 디렉토리 수를 제공합니다. 이것은 $.현재 입력 라인 번호를 보유하는 특수 변수 인 현재 값과 함께 인쇄됩니다 . 이것이 마지막에 실행되기 때문에 현재 입력 라인 번호는 마지막 라인의 번호가되므로 지금까지 본 라인 수입니다.

명확성을 위해 perl 명령을 다음과 같이 확장 할 수 있습니다.

find  . -type f -iname '*.c' -printf '%h\0' | 
    perl -0 -e 'while($line = <STDIN>){
                    $dirs{$line}++; 
                    $tot++;
                } 
                $count = scalar keys %dirs; 
                print "$count $tot\n" '

4

내 제안은 다음과 같습니다.

#!/bin/bash
tempfile=$(mktemp)
find -type f -name "*.c" -prune >$tempfile
grep -c / $tempfile
sed 's_[^/]*$__' $tempfile | sort -u | grep -c /

이 짧은 스크립트는 임시 파일을 작성하고 현재 디렉토리의 내부 및 아래에있는 모든 파일을 찾고 임시 파일에 .c목록을 씁니다. grep다음 (다음 파일을 계산하는 데 사용됩니다 ? 내가 명령 줄을 사용하여 디렉토리에있는 파일의 수를 얻을 수있는 방법을 두 번) : 두 번째 시간, 여러 번 나와있는 디렉토리를 사용하여 제거 sort -u하여 각 줄에서 파일 이름을 제거 후 sed.

또한 파일 이름의 grep -c /줄 바꿈과 함께 올바르게 작동 합니다. 슬래시가있는 줄만 계산하므로 목록에서 여러 줄 파일 이름의 첫 줄만 고려합니다.

산출

$ tree
.
├── 1
│   ├── 1
│   │   ├── test2.c
│   │   └── test.c
│   └── 2
│       └── test.c
└── 2
    ├── 1
    │   └── test.c
    └── 2

$ tempfile=$(mktemp);find -type f -name "*.c" -prune >$tempfile;grep -c / $tempfile;sed 's_[^/]*$__' $tempfile | sort -u | grep -c /
4
3

4

작은 셸 스크립트

두 가지 기본 명령 줄과 filetype다른 파일 형식을 찾기 위해 쉽게 전환 할 수 있는 변수 가 있는 작은 bash 셸 스크립트를 제안합니다 .

심볼릭 링크를 찾거나 심볼릭 링크를 사용하지 않고 일반 파일 만 찾습니다.

#!/bin/bash

filetype=c
#filetype=pdf

# count the 'filetype' files

find -type f -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l | tr '\n' ' '

# count directories containing 'filetype' files

find -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)'" \;|grep 'contains file(s)$'|wc -l

자세한 셸 스크립트

이것은 심볼릭 링크를 고려한 더 장황한 버전입니다.

#!/bin/bash

filetype=c
#filetype=pdf

# counting the 'filetype' files

echo -n "number of $filetype files in the current directory tree: "
find -type f -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l

echo -n "number of $filetype symbolic links in the current directory tree: "
find -type l -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l
echo -n "number of $filetype normal files in the current directory tree: "
find -type f -name "*.$filetype" -ls|sed 's#.* \./##'|wc -l
echo -n "number of $filetype symbolic links in the current directory tree including linked directories: "
find -L -type f -name "*.$filetype" -ls 2> /tmp/c-counter |sed 's#.* \./##' | wc -l; cat /tmp/c-counter; rm /tmp/c-counter

# list directories with and without 'filetype' files (good for manual checking; comment away after test)
echo '---------- list directories:'
 find    -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)' || echo '{} empty'" \;
echo ''
#find -L -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)' || echo '{} empty'" \;

# count directories containing 'filetype' files

echo -n "number of directories with $filetype files: "
find -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)'" \;|grep 'contains file(s)$'|wc -l

# list and count directories including symbolic links, containing 'filetype' files
echo '---------- list all directories including symbolic links:'
find -L -type d -exec bash -c "ls -AF '{}' |grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)' || echo '{} empty'" \;
echo ''
echo -n "number of directories (including symbolic links) with $filetype files: "
find -L -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null && echo '{} contains file(s)'" \; 2>/dev/null |grep 'contains file(s)$'|wc -l

# count directories without 'filetype' files (good for checking; comment away after test)

echo -n "number of directories without $filetype files: "
find -type d -exec bash -c "ls -AF '{}'|grep -e '\.'${filetype}$ -e '\.'${filetype}'\*'$ > /dev/null || echo '{} empty'" \;|grep 'empty$'|wc -l

테스트 출력

짧은 쉘 스크립트에서 :

$ ./ccntr 
29 7

자세한 셸 스크립트에서 :

$ LANG=C ./c-counter
number of c files in the current directory tree: 29
number of c symbolic links in the current directory tree: 1
number of c normal files in the current directory tree: 29
number of c symbolic links in the current directory tree including linked directories: 42
find: './cfiles/2/2': Too many levels of symbolic links
find: './cfiles/dirlink/2': Too many levels of symbolic links
---------- list directories:
. empty
./cfiles contains file(s)
./cfiles/2 contains file(s)
./cfiles/2/b contains file(s)
./cfiles/2/a contains file(s)
./cfiles/3 empty
./cfiles/3/b contains file(s)
./cfiles/3/a empty
./cfiles/1 contains file(s)
./cfiles/1/b empty
./cfiles/1/a empty
./cfiles/space d contains file(s)

number of directories with c files: 7
---------- list all directories including symbolic links:
. empty
./cfiles contains file(s)
./cfiles/2 contains file(s)
find: './cfiles/2/2': Too many levels of symbolic links
./cfiles/2/b contains file(s)
./cfiles/2/a contains file(s)
./cfiles/3 empty
./cfiles/3/b contains file(s)
./cfiles/3/a empty
./cfiles/dirlink empty
find: './cfiles/dirlink/2': Too many levels of symbolic links
./cfiles/dirlink/b contains file(s)
./cfiles/dirlink/a contains file(s)
./cfiles/1 contains file(s)
./cfiles/1/b empty
./cfiles/1/a empty
./cfiles/space d contains file(s)

number of directories (including symbolic links) with c files: 9
number of directories without c files: 5
$ 

4

간단한 펄 원 라이너 :

perl -MFile::Find=find -le'find(sub{/\.c\z/ and -f and $c{$File::Find::dir}=++$c}, @ARGV); print 0 + keys %c, " $c"' dir1 dir2

또는 find명령으로 더 간단합니다 .

find dir1 dir2 -type f -name '*.c' -printf '%h\0' | perl -l -0ne'$c{$_}=1}{print 0 + keys %c, " $."'

골프를 좋아하고 최근 (10 세 미만) Perl이있는 경우 :

perl -MFile::Find=find -E'find(sub{/\.c$/&&-f&&($c{$File::Find::dir}=++$c)},".");say 0+keys%c," $c"'
find -type f -name '*.c' -printf '%h\0'|perl -0nE'$c{$_}=1}{say 0+keys%c," $."'

2

locate명령보다 훨씬 빠른 명령을 사용하십시오 find.

테스트 데이터에서 실행

$ sudo updatedb # necessary if files in focus were added `cron` daily.
$ printf "Number Files: " && locate -0r "$PWD.*\.c$" | xargs -0 -I{} sh -c 'test ! -L "$1" && echo "regular file"' _  {} | wc -l &&  printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -cu | wc -l
Number Files: 29
Number Dirs.: 7

Muru 덕분에 Unix & Linux 의 파일 수에서 심볼릭 링크를 제거하는 데 도움을 준 그의 답변에 감사드립니다 .

Unix & Linux answer$PWD 에서 (나에게 지시되지 않음)에 대한 답변을 주신 Terdon에게 감사드립니다 .


아래의 원래 답변은 주석으로 참조

짧은 형식:

$ cd /
$ sudo updatedb
$ printf "Number Files: " && locate -cr "$PWD.*\.c$"
Number Files: 3523
$ printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l 
Number Dirs.: 648
  • sudo updatedb업데이트 데이터베이스에서 사용하는 locate경우 명령을 .c삭제 한 경우 파일이 오늘 생성 된 또는 .c현재 파일을.
  • locate -cr "$PWD.*\.c$".c현재 디렉토리에서 모든 파일을 찾고 하위 디렉토리 ( $PWD)입니다. 파일 이름을 인쇄하는 대신 -c인수로 인쇄 횟수를 계산 합니다. r지정 대신 기본의 정규식 *pattern*너무 많은 결과를 얻을 수 일치.
  • locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l. *.c현재 디렉토리와 아래에서 모든 파일을 찾으십시오 . sed디렉토리 이름 만 남겨두고 파일 이름을 제거하십시오 . 를 사용하여 각 디렉토리의 파일 수를 계산하십시오 uniq -c. 로 디렉토리 수를 센다 wc -l.

하나의 라이너로 현재 디렉토리에서 시작

$ cd /usr/src
$ printf "Number Files: " && locate -cr "$PWD.*\.c$" &&  printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Files: 3430
Number Dirs.: 624

파일 개수와 디렉토리 개수가 어떻게 변경되었는지 확인하십시오. 나는 모든 사용자가 /usr/src디렉토리를 가지고 있다고 생각하고 설치된 커널 수에 따라 다른 수로 위의 명령을 실행할 수 있습니다.

긴 형태 :

긴 형식에는 시간이 포함되어 있으므로 얼마나 빨리 locate끝났 는지 알 수 있습니다 find. 당신이 sudo updatedb그것을 실행 해야하는 경우에도 하나보다 몇 배 빠릅니다 find /.

───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ sudo time updatedb
0.58user 1.32system 0:03.94elapsed 48%CPU (0avgtext+0avgdata 7568maxresident)k
48inputs+131920outputs (1major+3562minor)pagefaults 0swaps
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Files: " && locate -cr $PWD".*\.c$")
Number Files: 3523

real    0m0.775s
user    0m0.766s
sys     0m0.012s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate -r $PWD".*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l) 
Number Dirs.: 648

real    0m0.778s
user    0m0.788s
sys     0m0.027s
───────────────────────────────────────────────────────────────────────────────────────────

참고 : 이것은 모든 드라이브 및 파티션의 모든 파일입니다 . 즉, Windows 명령도 검색 할 수 있습니다.

$ time (printf "Number Files: " && locate *.exe -c)
Number Files: 6541

real    0m0.946s
user    0m0.761s
sys     0m0.060s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate *.exe | sed 's%/[^/]*$%/%' | uniq -c | wc -l) 
Number Dirs.: 3394

real    0m0.942s
user    0m0.803s
sys     0m0.092s

세 개의 Windows 10 NTFS 파티션이 자동으로 마운트되어 /etc/fstab있습니다. 위치는 모든 것을 알고 있음을 명심하십시오!

재미있는 수 :

$ time (printf "Number Files: " && locate / -c &&  printf "Number Dirs.: " && locate / | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Files: 1637135
Number Dirs.: 286705

real    0m15.460s
user    0m13.471s
sys     0m2.786s

286,705 개의 디렉토리에서 1,637,135 개의 파일을 계산하는 데 15 초가 걸립니다. YMMV.

locate명령의 정규식 처리 에 대한 자세한 내용 은 (이 Q & A에 필요하지 않지만 경우에 따라 사용되는 것으로 나타남) 다음을 읽으십시오. 특정 디렉토리에서 "locate"를 사용 하시겠습니까?

최근 기사에서 추가로 읽은 내용 :


1
특정 디렉토리의 파일은 계산하지 않습니다. 지적했듯이 일치하는 모든 파일 (또는 디렉토리 또는 다른 유형의 파일)을 계산합니다 ( 인용하지 않기 때문에 현재 디렉토리에 .c이름이 지정된 파일이 있으면 중단됩니다 ). 그러면 모든 디렉토리가 인쇄됩니다 .c 파일을 포함하는지 여부에 관계없이 시스템에서. -.c*.c
— terdon

@terdon 당신은 디렉토리를 전달할 수 있습니다 ~/my_c_progs/*.c. .c프로그램으로 638 개의 디렉토리를 세고 있으며 전체 디렉토리는 나중에로 표시됩니다 286,705. 큰 따옴표` "* .c"에 대한 답을 수정하겠습니다. 팁 고마워.
— WinEunuuchs2Unix

3
예,와 같은 것을 사용할 수 locate -r "/path/to/dir/.*\.c$"있지만 답의 어느 곳에서도 언급되지 않았습니다. 당신은 이것을 언급하는 다른 답변에 대한 링크 만 제공하지만 여기에 묻는 질문에 대답하기 위해 그것을 조정하는 방법에 대한 설명은 없습니다. 전체 답변은 시스템의 총 파일 및 디렉토리 수를 계산하는 방법에 중점을 둡니다. 이는 ".c 파일 수를 계산하는 방법 및 포함하는 디렉토리 수를 어떻게 계산할 수 있는지에 대한 질문과는 관련이 없습니다. 특정 디렉토리의 c 파일 " 또한 번호가 잘못되었습니다. OP의 예에서 시도하십시오.
— terdon

@terdon 입력 주셔서 감사합니다. 나는 당신의 제안과 $PWD변수 에 대한 다른 SE 사이트에 게시 한 답변으로 개선했습니다 : unix.stackexchange.com/a/188191/200094
— WinEunuuchs2Unix

1
이제 $PWD정규 표현식에서 특별한 문자가 포함되지 않도록 해야합니다.
— muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.