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


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.