파일의 확장자를 찾고 있습니다. Cut은 파일에 확장자가 없는 경우에만 파일 이름을 제공하므로 "."이 없을 때 Cut에 "확장자 없음"을 제공하고 싶습니다. 내가 이것을 참조로 사용하고 있다는 것을 알았습니다.https://stackoverflow.com/questions/1842254/how-can-i-find-all-of-the-distinct-file-extensions-in-a-folder-hierarchy확장자가 없는 파일은 무시한다는 답변은 좋지 않습니다. 이런 파일도 찾아야 하기 때문입니다.
답변1
zsh
쉘 에서 :
print -rC1 ./**/*(.:e) | sed 's/^$/EXTENSIONLESS/' | sort | uniq -c
그러면 현재 디렉토리 안이나 아래의 모든 일반 파일에 대해 한 줄에 모든 확장자가 인쇄됩니다. 빈 확장자는 정렬 및 계산되기 전에 EXTENSIONLESS
텍스트로 대체 됩니다.sed
**
경로 이름의 glob은 해당 쉘에 쉘 옵션이 설정된 경우와 동일한 패턴과 ("재귀적으로") zsh
일치합니다 ./
bash
globstar
(.:e)
패턴 끝에는 이전 패턴이 일반 파일에만 일치하도록 (.)
하고 일치하는 각 이름( )에서 확장자를 제외한 모든 항목을 제거하는 전역 한정자가 있습니다 :e
.
같은 일이지만 dummy.EXTENSIONLESS
확장자가 없는 파일 이름을 와일드카드 표현식의 파일 이름으로 바꾸는 표현식을 사용하여 e['...']
호출을 제거합니다 sed
.
print -rC1 src/**/*(.e['[ -z $REPLY:e ] && REPLY=dummy.EXTENISONLESS']:e) | sort | uniq -c
셸 이 아닌 경우 인라인 셸 스크립트를 사용하여 위 파이프라인의 처음 몇 부분을 실행할 zsh
수 있습니다 .find
find . -type f -exec sh -c '
for pathname do
name=${pathname##*/}
case $name in
*.?*)
printf "%s\n" "${name##*.}" ;;
*)
echo EXTENSIONLESS
esac
done' sh {} + | sort | uniq -c
find
이는 현재 디렉토리 안이나 아래의 모든 일반 파일을 찾는 데 사용됩니다 . 이러한 파일 배치의 경우 인라인 셸 스크립트를 호출합니다. 스크립트는 현재 경로 이름 세트를 반복하고 각 경로 이름의 파일 이름 부분을 변수로 추출합니다 name
. 그런 다음 $name
점과 적어도 하나의 다른 문자가 포함되어 있는지 테스트합니다 . 이름에 점이 있으면 점 뒤의 부분이 인쇄되고, 그렇지 않으면 EXTENTSIONLESS
문자열이 인쇄됩니다.
find
그런 다음 출력은 이전과 동일한 방식으로 정렬되고 계산됩니다.
위의 코드는 hello.
확장자와 유사한 이름으로 이름을 호출하지만 .bashrc
확장자를 갖습니다 . 점 양쪽에 문자가 필요 하도록 bashrc
모드를 변경합니다 ( 확장자가 없는 것으로 처리됨).*.?*
*?.?*
.bashrc