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
플래그 를 사용할 수 있습니다 .
wc
null 종료 목록을 읽을 수있는 옵션이 없다면 도움이되지 않습니다 . 대안에 대한 내 대답을 참조하십시오.
현재 디렉토리의 경우 :
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 -l
1.7 / 0.5 / 1.33 초 (real / user / sys)가 걸렸습니다. rsync --stats --dry-run -ax ~ /xxx
4.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
와 거의 동일한 시스템 호출을 실행하는 것처럼 보입니다 . 그냥 쳤다. du
ncdu
현재 디렉토리에 몇 개의 파일이 있는지 확인하려면 다음을 입력하십시오 ls -1 | wc -l
. 의 출력에서 wc
라인 수를 계산하는 데 사용 됩니다 . 도트 파일은 포함하지 않습니다. 점에 유의하시기 바랍니다(-l)
ls -1
ls -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 -l
stat
크기, 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)를 혼동하고 있습니다.