Linux 디렉토리에서 파일을 재귀 적으로 계산하는 방법은 무엇입니까?
나는 이것을 찾았다:
find DIR_NAME -type f ¦ wc -l
그러나 이것을 실행하면 다음 오류가 반환됩니다.
찾기 : 경로는 식 앞에 와야합니다. ¦
*다른 맥락에서 "별표"ASCII 문자 만 "시간"입니다.
Linux 디렉토리에서 파일을 재귀 적으로 계산하는 방법은 무엇입니까?
나는 이것을 찾았다:
find DIR_NAME -type f ¦ wc -l
그러나 이것을 실행하면 다음 오류가 반환됩니다.
찾기 : 경로는 식 앞에 와야합니다. ¦
*다른 맥락에서 "별표"ASCII 문자 만 "시간"입니다.
답변:
이것은 작동해야합니다 :
find DIR_NAME -type f | wc -l
설명:
-type f 파일 만 포함합니다.|( 및 아님¦ ) find명령의 표준 출력을wc 명령의 표준 입력으로 합니다.wc(단어 수의 줄임말) 입력에서 개행, 단어 및 바이트 수를 계산합니다 ( 문서 ).-l 줄 바꿈 만 계산합니다.노트:
DIR_NAME로. 현재 폴더에서 명령을 실행합니다.-type f카운트에 디렉토리 (및 심볼릭 링크)를 포함 위해를 .예제가 작동하지 않는 이유에 대한 설명 :
표시 한 명령에서 "파이프"( |)를 사용하여 두 명령을 연결 ¦하지 않고 쉘이 명령 또는 이와 유사한 것으로 인식하지 못하는 깨진 막대 ( )를 사용합니다. 그 때문에 오류 메시지가 나타납니다.
f에서이 -type f파일과 의미 wc -l단어 수 라인을 위해.
-type f카운트에 디렉토리를 포함 시키기 위해를 제거하십시오
-print깃발이 필요 없습니다
-print0플래그 를 사용할 수 있습니다 .
wcnull 종료 목록을 읽을 수있는 옵션이 없다면 도움이되지 않습니다 . 대안에 대한 내 대답을 참조하십시오.
현재 디렉토리의 경우 :
find -type f | wc -l
.
find .
현재 디렉토리 아래의 각 디렉토리에있는 파일 수를 분석하려면 다음을 수행하십시오.
for i in */ .*/ ; do
echo -n $i": " ;
(find "$i" -type f | wc -l) ;
done
물론 한 줄로 갈 수 있습니다. 괄호 wc -l는 ( find $i -type f이 경우) 출력 을보고 있어야하는 것을 명확 하게합니다 .
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; do수정하십시오. 파일 (데이터 스트림, 변수)을 한 줄씩 또는 필드별로 읽는 방법을
find외부 루프에 사용 하는 것은 불필요하게 복잡합니다. for i in */; do`
당신이 사용할 수있는
$ tree
트리 패키지를 설치 한 후
$ sudo apt-get install tree
(데비안 / 민트 / 우분투 리눅스 머신에서).
이 명령은 파일 수뿐만 아니라 디렉토리 수도 별도로 표시합니다. -L 옵션을 사용하여 최대 표시 레벨 (기본적으로 디렉토리 트리의 최대 깊이)을 지정할 수 있습니다.
-a옵션 을 제공하여 숨겨진 파일도 포함 할 수 있습니다 .
-a을 포함하는 옵션을 선택합니다.
brew실행 brew install tree한 후 사용 하고 실행하십시오 brew update.
내 컴퓨터 에서 허용되는 답변 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"파일 시스템 경계를 넘지 않음"옵션을 사용했습니다. 즉, 파일 시스템을 실행하고 /외부 하드 디스크를 연결 한 경우 루트 파티션의 파일 만 계산합니다.find ~ -type f | wc -l1.7 / 0.5 / 1.33 초 (real / user / sys)가 걸렸습니다. rsync --stats --dry-run -ax ~ /xxx4.4 / 3.1 / 2.1 초가 걸렸습니다. SSD에 약 500,000 개의 파일이 있습니다.
Number of files: 487 (reg: 295, dir: 192)
rsync version 2.6.9 protocol version 29
UNIX의 파일 이름에는 개행 (예, 개행)이 포함될 수 있으므로 wc -l너무 많은 파일이 계산 될 수 있습니다. 모든 파일에 대해 점을 인쇄 한 다음 점을 계산합니다.
find DIR_NAME -type f -printf "." | wc -c
여기에 몇 가지 답변을 결합하면 가장 유용한 해결책은 다음과 같습니다.
find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n
공백과 괄호를 포함하는 파일 이름과 같은 이상한 것을 처리 할 수 있습니다. 또한 파일 수에 따라 출력을 정렬합니다.
-maxdepth하위 디렉토리도 계산 한 후 수를 늘릴 수 있습니다 . 특히 중첩 된 디렉토리 구조가 -maxdepth많을 경우 높은 수의 디렉토리 구조를 사용하는 경우 시간이 오래 걸릴 수 있습니다.
echo -e? 줄 바꿈을 접는 데 넣었지만 다른 불규칙한 공백을 엉망으로 만들고 파일 이름에 그대로 존재하는 와일드 카드 문자를 확장하려고 시도합니다. 나는 단순히 find .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'출력물에 어떤 수차를 가지고 살거나 printf "%q"디렉토리 이름을 인쇄하기 위해 Bash와 함께 연주 할 것 입니다.
현재 작업 디렉토리에 존재하는 파일 및 하위 디렉토리 수를 알고 싶다면이 단일 라이너를 사용할 수 있습니다
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n
이것은 GNU 풍미에서 작동하며 BSD linux (예 : OSX)의 echo 명령에서 -e를 생략하면됩니다.
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
echo -e인용되지 않은 디렉토리 이름에 (위의 코멘트와 같이하거나`echo`는) 다른 하나 문제를 거래.
오류가 발생하지 않도록하려면 줄 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 wc에는 null 종료 목록 (파일 제외)을 읽거나 계산하는 옵션이없는 것처럼 보이기 때문에 가장 쉬운 해결책은 파일 이름을 전달하지 않는 것이지만 파일을 찾을 때마다 정적 출력입니다. 위와 같은 디렉토리에
> find -type f -exec printf '\n' \; | wc -l
1
또는 당신 find이 그것을 지원하는 경우
> find -type f -printf '\n' | wc -l
1
명령을 사용할 수 있습니다 ncdu. Linux 디렉토리에 포함 된 파일 수를 재귀 적으로 계산합니다. 다음은 출력 예입니다.
진행률 표시 줄이있어 파일이 많은 경우 편리합니다.
우분투에 설치하려면 :
sudo apt-get install -y ncdu
벤치 마크 : https://archive.org/details/cv_corpus_v1.tar (380390 파일, 11GB)를 파일 수를 계산 해야하는 폴더로 사용했습니다.
find . -type f | wc -l: 완성되는 약 1m20sncdu: 완성되는 약 1m20sfind . -type f | wc -l및 ncdu.
find와 거의 동일한 시스템 호출을 실행하는 것처럼 보입니다 . 그냥 쳤다. duncdu
현재 디렉토리에 몇 개의 파일이 있는지 확인하려면 다음을 입력하십시오 ls -1 | wc -l. 의 출력에서 wc라인 수를 계산하는 데 사용 됩니다 . 도트 파일은 포함하지 않습니다. 점에 유의하시기 바랍니다(-l)ls -1ls -l 실제로 당신에게 실제 수보다 파일 수를 하나 개 더 줄 것이 HOWTO의 이전 버전에서 사용 (에 "L"이 아니라 앞의 예에서와 같이 "1"의 그). 이 점에 대해 Kam Nejad에게 감사합니다.
파일 만 계산하고 기호 링크를 포함하지 않으려는 경우 (다른 방법으로 수행 할 수있는 예) ls -l | grep -v ^l | wc -l"이것은"1 "이 아닌"L "이며 여기에"긴 "목록이 필요합니다. . grep링크를 나타내는 "l"로 시작하는 행을 확인하고 해당 행을 버립니다 (-v).
상대 속도 : "ls -1 / usr / bin / | wc -l"은 언로드 된 486SX25 (이 시스템의 / usr / bin /에는 355 개의 파일이 있음)에서 약 1.03 초가 걸립니다. " ls -l /usr/bin/ | grep -v ^l | wc -l"는 약 1.19 초가 걸립니다.
ls -lstat크기, mtime 및 기타 속성을 읽으려면 모든 파일에서 syscall을 수행해야합니다 . 큰 디렉토리 (100.000+ 파일)에서 실행하는 ls -l데 몇 분이 걸릴 수 있습니다. 따라서 파일 만 계산하려면 항상을 사용하십시오 ls -1 | wc -l.
bash로 :
()를 사용하여 항목 배열을 만들고 #을 사용하여 개수를 가져옵니다.
FILES=(./*); echo ${#FILES[@]}
좋아, 그것은 재귀 적으로 파일을 세지 않지만 간단한 옵션을 먼저 보여주고 싶었다. 일반적인 사용 사례는 파일의 롤오버 백업을 생성하는 것일 수 있습니다. 이것은 logfile.1, logfile.2, logfile.3 등을 생성합니다.
CNT=(./logfile*); mv logfile logfile.${#CNT[@]}
bash 4 이상이 globstar활성화 된 재귀 카운트 (@tripleee에서 언급 한대로)
FILES=(**/*); echo ${#FILES[@]}
재귀 적으로 파일 수를 구하기 위해 여전히 같은 방식으로 find를 사용할 수 있습니다.
FILES=(`find . -type f`); echo ${#FILES[@]}
**/*은 재귀 열거를 지원 합니다. find쉘은 각 디렉토리에서 파일을 정렬해야하기 때문에 여전히 큰 디렉토리 보다 효율성이 떨어집니다 .
이름이 공백 인 디렉토리의 경우 ... (위의 다양한 답변을 기반으로 함)-디렉토리 이름을 다음과 같은 파일 수로 재귀 적으로 인쇄합니다.
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 /(아래 사용) /unix/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
Applcation : 수백 개의 디렉토리 중 최대 파일 수를 찾고 싶습니다 (모든 깊이 = 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
찾기 유형 f | 화장실 -l
또는 (디렉토리가 현재 디렉토리 인 경우)
찾기 . 타입 f | 화장실 -l
¦(ASCII 166)와 UNIX 파이프 라인에|사용되는 세로 막대 (ASCII 124)를 혼동하고 있습니다.