programing

리눅스 디렉터리의 파일을 반복적으로 계산합니다.

javamemo 2023. 4. 25. 21:48
반응형

리눅스 디렉터리의 파일을 반복적으로 계산합니다.

Linux 디렉토리의 파일을 반복적으로 계산하려면 어떻게 해야 합니까?

이걸 찾았어요

find DIR_NAME -type f ¦ wc -l

그러나 이 프로그램을 실행하면 다음과 같은 오류가 반환됩니다.

찾기: 경로는 식 ¦ 앞에 와야 합니다.

이렇게 하면 됩니다.

find DIR_NAME -type f | wc -l

설명:

  • -type f이겁니다.
  • |(및 아님) 리디렉션합니다.find명령어의 출력입니다.wc이겁니다.
  • wc(워드 카운트의 줄임말) 입력에서 줄임말, 워드 및 바이트를 카운트합니다(입력).
  • -l줄만 세면 돼요

주의:

  • 체하다다를 바꿉니다.DIR_NAME와와 with와 함께요..이겁니다.
  • 그리고 이 때 빼도 돼요.-type f개수에 디렉터리(및 심볼 링크)를 포함합니다.
  • 파일 이름에 줄 바꿈 문자가 포함될 수 있는 경우 이 명령이 초과될 수 있습니다.

예제가 작동하지 않는 이유를 설명합니다.

보여드린 에서는 "파이프"(파이프)를 사용하지 않습니다.|두 개의 명령어를 연결하지만, 끊어진 막대(마지막으로 하다)를 연결합니다. 러러 ). ). ). ). ). ). ). ). ). ).( )입니다.¦셸이 명령 또는 유사한 명령으로 인식하지 않습니다.네, 그렇습니다.

현재 디렉터리에 대해 다음을 수행합니다.

find -type f | wc -l

현재 dir 아래의 각 dir에 있는 파일 수를 분석하려면 다음과 같이 하십시오.

for i in */ .*/ ; do 
    echo -n $i": " ; 
    (find "$i" -type f | wc -l) ; 
done

물론 이 모든 것을 한 줄에 담을 수 있습니다.괄호는 누구의 출력인지 명확히 합니다.wc -l보고 있어야 합니다.find $i -type f이렇게 말합니다.

제 컴퓨터에는요,rsync 더 빠르다고 할 수 있습니다.find | wc -l이겁니다.

$ rsync --stats --dry-run -ax /path/to/dir /tmp

Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes

두 번째 줄에는 위의 예에서 150,481개의 파일 수가 있습니다.보너스로 총 크기(바이트)도 제공됩니다.

비고:

  • 첫 번째 줄은 파일, 디렉토리, 심볼링크 등의 수를 모두 합친 것이므로 두 번째 줄보다 큽니다.
  • 더 »--dry-run(혹은 (?)요?)-n즉, 파일을 실제로 전송하지 않으려면 옵션이 중요합니다.
  • 사용했어요.-x파일 시스템 경계를 넘나들지 즉, "파일 시스템 경계를 넘나들지 마십시오."에 대해 실행할 경우 이 옵션을 선택합니다./외장 하드 디스크가 연결되어 있으면 루트 파티션의 파일만 계산됩니다.

사용할 수 있습니다.

$ tree

트리 패키지를 설치한 후 다음을 수행합니다.

$ sudo apt-get install tree

(Debian / Mint / Ubuntu Linux 머신에 있습니다).

이 명령은 파일 수뿐만 아니라 디렉터리 수도 별도로 표시합니다.L 옵션을 사용하여 최대 표시 수준(기본적으로 디렉터리 트리의 최대 깊이)을 지정할 수 있습니다.

숨김 파일은 숨김 파일도 포함할 수 있습니다.-a네, 그렇습니다.

UNIX의 에는 줄 바꿈(예, 줄 바꿈)이 포함될 수 있으므로 UNIX는 줄 바꿈(예, 줄 바꿈)을 포함합니다.wc -l이겁니다.모든 파일에 대해 점을 찍어낸 다음 점을 셉니다.

find DIR_NAME -type f -printf "." | wc -c

참고 하다: 하다.-printfGNU findutils를 찾습니다.맥입니다.

여기에 나와 있는 몇 가지 답변을 종합하면 가장 유용한 솔루션은 다음과 같습니다.

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n

공백 괄호가 포함된 파일 이름이나 새 줄과 같은 이상한 것들을 처리할 수 있습니다.또한 파일 수를 기준으로 출력을 정렬합니다.

이렇게 하다보다 뒤에 숫자를 늘릴 수 있습니다.-maxdepth 높은 중첩 디렉터리 구조와 높은 중첩 디렉터리 구조를 함께 사용하는 경우 시간이 오래 걸릴 수 있습니다. 특히 높은 디렉토리 구조와 높은 디렉토리 구조를 함께 사용하는 경우 더 그렇습니다.-maxdepth네, 그렇습니다.

현재 작업 디렉터리에 있는 파일 및 하위 디렉터리의 수를 알고 싶다면 이 한 줄을 사용할 수 있습니다.

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

이것은 GNU 플레이버에서 작동하며 BSD Linux(예: OSX)의 경우 echo 명령에서 -e를 생략합니다.

명령을 사용할 수 있습니다.리눅스 디렉터리에 포함된 파일 수를 반복적으로 계산합니다.다음은 출력의 예입니다.

여기에 이미지 설명을 입력하십시오.

진행 표시줄이 있어 파일이 많을 때 편리합니다.

여기에 이미지 설명을 입력하십시오.

Ubuntu에 설치하려면 다음을 수행합니다.

sudo apt-get install -y ncdu

벤치마크:파일 수를 세는 폴더로는 https://archive.org/details/cv_corpus_v1.tar(380390 파일, 11GB)을 사용했습니다.

  • find . -type f | wc -l 약 1m20s 완료: 1 1m20s 성 1 1m20s 。
  • ncdu 약 1m20s 완료: 1 1m20s 성 1 1m20s 。

특정 파일 형식을 반복적으로 계산해야 하는 경우 다음을 수행할 수 있습니다.

find YOUR_PATH -name '*.html' -type f | wc -l 

-l이겁니다.

특정 폴더를 제외해야 할 경우에는 을 사용하세요.-not -path

find . -not -path './node_modules/*' -name '*.js' -type f | wc -l
tree $DIR_PATH | tail -1

샘플 출력:

5309개의 디렉토리, 2122개의 파일입니다.

에러 케이스를 피하고 싶다면, 에러 케이스를 허용하지 마세요.wc -l줄 바꿈이 있는 파일(2개 이상의 파일로 계산됨)을 보려면 을 클릭하십시오.

예를 들어 단일 EOL 문자가 포함된 단일 파일이 있는 경우를 생각해 보십시오.

> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

적어도 gnu는 gnu이기 때문입니다.wc에는 null 종료된 목록(파일 제외)을 읽거나 카운트하는 옵션이 것 같습니다. 가장 쉬운 해결책은 파일 이름을 전달하지 않고 파일이 발견될 때마다 정적 출력(예: 위와 같은 디렉토리(예: null)에 출력하는 것입니다. 가장 쉬운 해결책은 파일 이름을 전달하지 않고 파일이 발견될 때마다(예: 위와 같은 디렉터리에서) 정적 출력을 제공하는 것입니다.

> find -type f -exec printf '\n' \; | wc -l
1

아니면 만약 당신이요?find그것을 지지합니다.

> find -type f -printf '\n' | wc -l
1 

현재 디렉터리에 몇 개의 파일이 확인하려면 을(를) 넣으십시오.ls -1 | wc -l. 이것은 . 을 사용해요wc줄 수를 (-l)of결 of of of of of of of의 출력에 있습니다.ls -1이겁니다.주의해 주세요.ls -l이전 버전의 HOWTO에서 사용한 파일 수는 실제 수보다 한 개 더 많습니다.캄네자드입니다.

심볼 링크를 포함하지 않고 파일만 계산하려면(다른 작업을 수행할 수 있는 예에 불과함) 다음을 사용할 수 있습니다.ls -l | grep -v ^l | wc -l('1'은 'L'은 'L'은 'L'은 'L'은'은요. 이렇게 말합니다.)grep는 "l"(링크 연결)로 시작하는 행을 한 후 해당 행(-v)을 삭제합니다.

상대 속도: "ls -1 /usr/bin/ | wc -l"은 언로드된 486SX25에서 약 1.03초 걸립니다(이 기계의 /usr/bin/에는 355개의 파일이 있습니다).를 클릭합니다.ls -l /usr/bin/ | grep -v ^l | wc -l1.19초 정도 .

출처: http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html입니다.

bash 포함:

( )를 사용하여 항목 배열을 생성하고 #를 사용하여 개수를 가져옵니다.

FILES=(./*); echo ${#FILES[@]}

네, 파일이 반복적으로 카운트되지 않지만 먼저 간단한 옵션을 보여드리고 싶었습니다.일반적인 사용 사례는 파일의 롤오버 백업을 생성하는 것일 수 있습니다.그러면 logfile.1, logfile.2, logfile.3 등이 생성됩니다.

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

bash 4+bash 4+인 재귀 카운트입니다.globstar@subliceee (( @sublicee 에에 @sublicee.

FILES=(**/*); echo ${#FILES[@]}

파일 수를 재귀적으로 가져오려면 동일한 방법으로 찾기를 사용할 수 있습니다.

FILES=(`find . -type f`); echo ${#FILES[@]}

이름에 공백이 있는 디렉토리의 경우(위의 다양한 답변에 기반) - 디렉토리 이름을 파일 수로 반복 인쇄합니다.

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done

예(가독성을 위해 포맷됨):

pwd
  /mnt/Vancouver/Programming/scripts/claws/corpus

ls -l
  total 8
  drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
  drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'

ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
  138

## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
  29

디렉토리 는 보다 잘 시각화됩니다.tree다음을 참조하십시오

tree -L 3 -F .
  .
  ├── Catabolism - Autophagy; Phagosomes; Mitophagy/
  │   ├── 1
  │   ├── 10
  │   ├── [ ... SNIP! (138 files, total) ... ]
  │   ├── 98
  │   └── 99
  └── Catabolism - Lysosomes/
      ├── 1
      ├── 10
      ├── [ ... SNIP! (28 files, total) ... ]
      ├── 8
      ├── 9
      └── aaa/
          └── bbb

  3 directories, 167 files

man find | grep mindep
  -mindepth levels
    Do not apply any tests or actions at levels less than levels
    (a non-negative integer).  -mindepth 1 means process all files
    except the starting-points.

ls -p | grep -v /(아래에서 사용됨)은 https://unix.stackexchange.com/questions/48492/list-only-regular-files-but-not-directories-in-current-directory의 답변 2에 나와 있습니다.

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1

응용 프로그램:수백 개의 디렉터리 중 최대 파일 수(전체 깊이 = 1)를 찾고 싶습니다. [아래 출력은 읽기 쉽도록 다시 포맷되었습니다.]

date; pwd
    Fri Mar 29 20:08:08 PDT 2019
    /home/victoria/Mail/2_RESEARCH - NEWS

time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
    0:00.03

[victoria@victoria 2_RESEARCH - NEWS]$ head -n5 ../../aaa
    ./RNA - Exosomes: 26
    ./Cellular Signaling - Receptors: 213
    ./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
    ./Stress - Physiological, Cellular - General: 261
    ./Ancient DNA; Ancient Protein: 34

[victoria@victoria 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/\2: \1/g' ../../aaa | sort -V | (head; echo ''; tail)

    0: ./Genomics - Gene Drive
    1: ./Causality; Causal Relationships
    1: ./Cloning
    1: ./GenMAPP 2
    1: ./Pathway Interaction Database
    1: ./Wasps
    2: ./Cellular Signaling - Ras-MAPK Pathway
    2: ./Cell Death - Ferroptosis
    2: ./Diet - Apples
    2: ./Environment - Waste Management

    988: ./Genomics - PPM (Personalized & Precision Medicine)
    1113: ./Microbes - Pathogens, Parasites
    1418: ./Health - Female
    1420: ./Immunity, Inflammation - General
    1522: ./Science, Research - Miscellaneous
    1797: ./Genomics
    1910: ./Neuroscience, Neurobiology
    2740: ./Genomics - Functional
    3943: ./Cancer
    4375: ./Health - Disease 

sort -V자연스러운 종류입니다.따라서 이러한 (Claws Mail) 디렉토리의 최대 파일 수는 4375개입니다.왼쪽 패드(https://stackoverflow.com/a/55409116/1904943) 파일 이름)를 누르면, 각 디렉토리에서 1로 시작하는 숫자로 이름이 지정되고, 총 5자리로 패딩하면 됩니다.


부록입니다.

디렉토리에서 총 파일, 하위 디렉터리 수를 찾습니다.

$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS

$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News

Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine

$ find . -type f | wc -l
70214    ## files

$ find . -type d | wc -l
417      ## subdirectories

여기에는 많은 정답들이 있습니다.여기 또 있어요!

find . -type f | sort | uniq -w 10 -c

여기서, where where에 where.볼 폴더와 볼 폴더입니다.10이겁니다.

익스텐트 매핑을 지원하는 회전 디스크 및 파일 시스템 등의 특정 상황에서 재귀 파일 수를 빠르게 하기 위해 ffcnt를 작성했습니다.

보다 훨씬 더 빨리 수 있습니다.ls아니면요?find그러나 YMMV.는 YMMV입니다.

디렉토리당 총 파일을 원하는 경우 다음을 수행하십시오.

for d in `find YOUR_SUBDIR_HERE -type d`; do 
   printf "$d - files > "
   find $d -type f | wc -l
done

current dir에 대해 다음을 수행하십시오.

for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done;

공백 이름이 긴 경우 다음과 같이 IFS를 변경해야 합니다.

OIFS=$IFS; IFS=$'\n'
for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done
IFS=$OIFS

트리 명령을 사용하면 모든 파일과 폴더를 반복적으로 표시할 수 있습니다.또한 출력 마지막 줄에 폴더 및 파일 수를 표시합니다.

$ tree path/to/folder/
path/to/folder/
├── a-first.html
├── b-second.html
├── subfolder
│   ├── readme.html
│   ├── code.cpp
│   └── code.h
└── z-last-file.html

1 directories, 6 files

tree 명령의 마지막 출력 라인에 대해서만 tail 명령을 출력에 사용할 수 있습니다.

$ tree path/to/folder/ | tail -1
1 directories, 6 files

트리 설치를 위해 아래 명령을 사용할 수 있습니다.

$ sudo apt-get install tree

형식에 대한 필터링을 사용하는 이 대체 접근 방식은 사용 가능한 모든 grub 커널 모듈을 카운트합니다.

ls -l /boot/grub/*.mod | wc -l

위의 답변과 의견을 바탕으로 다음과 같은 파일 수 목록을 작성했습니다.특히 @Greg Bell이 제공하는 솔루션과 @Arch Stanton & @Schneams의 의견을 결합한 것입니다.

현재 디렉터리 및 하위 디렉터리에 있는 모든 파일을 계산합니다.

function countit { find . -maxdepth 1000000 -type d -print0 | while IFS= read -r -d '' i ; do file_count=$(find "$i" -type f | wc -l) ; echo "$file_count: $i" ; done }; countit | sort -n -r >file-count.txt

현재 디렉터리 및 하위 디렉터리에 있는 지정된 이름의 모든 파일을 계산합니다.

function countit { find . -maxdepth 1000000 -type d -print0 | while IFS= read -r -d '' i ; do file_count=$(find "$i" -type f | grep <enter_filename_here> | wc -l) ; echo "$file_count: $i" ; done }; countit | sort -n -r >file-with-name-count.txt

-type f | wc -l을 찾습니다.

OR(디렉토리가 현재 디렉토리인 경우)입니다.

. -type f | wc -l을 찾습니다.

이거면 충분히 잘 될 거예요.간단하게요.폴더에 있는 파일 수를 계산하려면 다음과 같이 하십시오.

ls | wc -l
ls -l | grep -e -x -e -dr | wc -l 
  1. 리스트가 길어요
  2. 파일 및 dir를 필터링합니다.
  3. 필터링된 줄을 카운트합니다.

언급URL : https://stackoverflow.com/questions/9157138/recursively-counting-files-in-a-linux-directory 입니다.

반응형