sed/bash 스크립트를 사용하여 마지막 변수 제거

sed/bash 스크립트를 사용하여 마지막 변수 제거

*/*/*/*/ ... */*.h 또는 .hpp로 작성된 여러 파일이 있습니다. 파일 자체가 아니라 이러한 파일의 디렉터리를 가져와야 합니다. sed를 사용하여 "마지막 / 줄을 찾아 \n까지 다음 항목을 삭제"하는 것과 같은 작업을 수행할 수 있는 방법이 있나요?

추신: \(.*\) 또는 (.*)가 i번째 발생 \i를 호출한다는 것을 알고 있지만 sed에게 \i를 제거하도록 지시할 수 있는 방법이 있습니까? \

편집:
다음과 같은 작업을 수행하여 파일을 생성했습니다.

find . | grep *.h >> file ; find . | grep *.hpp >> file

내가 처리하고 싶은 것은 이 파일의 내용이다.

답변1

파일 이름 접미사가 있는 파일이 포함된 디렉토리를 가져오거나 .h다음 .hpp을 사용하십시오 find.

find . -type f \( -name '*.h' -o -name '*.hpp' \) -exec dirname {} \;

이는 이름이 주어진 두 패턴 중 하나와 일치하는 모든 일반 파일의 경로 이름을 찾습니다. 이러한 각 경로 이름에 대해 이 dirname유틸리티는 경로 이름의 디렉터리 경로 부분을 추출하는 데 사용됩니다.

GNU를 사용하면 find이렇게 할 수 있습니다

find . -type f \( -name '*.h' -o -name '*.hpp' \) -printf '%h\n'

이는 비표준 형식 옵션을 사용하여 -printf경로 이름(즉, 디렉토리 경로)의 "헤더"를 인쇄합니다 %h.

고유한 경로 이름을 얻으려면 파일 대신 디렉터리 검색으로 전환할 수 있습니다.

find . -type d -exec bash -O nullglob -O dotglob -c '
    for pathname do
        set -- "$pathname"/*.{h,hpp}
        [[ $# -ne 0 ]] && printf "%s\n" "$pathname"
    done' bash {} +

이것은 bash디렉토리의 배치 경로 이름에 대한 짧은 스크립트를 실행합니다. 짧은 스크립트는 nullglob및 셸 옵션이 활성화된 상태로 실행됩니다 dotglob. 이는 일치하지 않는 와일드카드 패턴이 제거되고 와일드카드 패턴이 숨겨진 이름과도 일치할 수 있음을 의미합니다.

이 루프는 현재 경로 이름 배치를 반복하고 각 디렉토리에 있는 두 개의 와일드카드 패턴의 합계를 확장합니다 *.h. *.hpp패턴이 하나 이상의 이름과 일치하면 디렉터리의 경로 이름이 출력됩니다.

그러나 마지막 변형은 일반 파일뿐만 아니라 *.h이름 또는 와 일치하는 모든 유형의 파일이 포함된 디렉터리를 보고합니다.*.hpp


zsh쉘 에서 :

typeset -U dirs=(./**/*.(h|hpp)(.ND:h))
print -r -C1 $dirs

dirs그러면 고유한 요소만 저장하는 배열 변수가 생성됩니다 . 이를 *.h일치하는 일반 파일이 포함된 현재 디렉터리 아래의 디렉터리 집합으로 초기화 *.hpp하거나 배열의 내용을 인쇄합니다.

관련 정보