구분 기호를 찾을 수 없을 때 용어를 출력하도록 cut을 발생시킵니다.

구분 기호를 찾을 수 없을 때 용어를 출력하도록 cut을 발생시킵니다.

파일의 확장자를 찾고 있습니다. 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일치합니다 ./bashglobstar

(.: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

관련 정보