Shell 파일 이름과 접 두 사 를 캡 처

5021 단어 linuxbashshell
본 고 는 개인 블 로그http://zuyunfei.com/2016/03/2...에 첫 발 을 내 디 뎠 습 니 다.최신 내용 을 읽 는 것 을 환영 합 니 다!
파일 이름과 접 두 사 를 캡 처 합 니 다.
Shell 스 크 립 트 를 작성 하 는 과정 에서 파일 이름과 파일 경 로 를 자주 만 납 니 다.사용자 가 파일 의 전체 이름(절대 경로 와 파일 접 두 사 를 포함 할 수 있 음)을 입력 하면 파일 의 경로 이름,파일 이름,파일 접두사 등 정 보 를 어떻게 얻 을 수 있 습 니까?셸 스 크 립 트 는 강력 한 문자열 처리 능력 을 가지 고 있 습 니 다.파일 이름 을 문자열 로 사용 하면 cut 나 sed 같은 도 구 를 사용 하여 원 하 는 결 과 를 얻 기 어렵 지 않 습 니 다.
$fullfile=/the/path/foo.txt
$fullname=$(basename $fullfile)
$dir=$(dirname $fullfile)
$filename=$(echo $fullname | cut -d . -f1)
$extension=$(echo $fullname | cut -d . -f2)
$ echo $dir , $fullname , $filename , $extension
/the/path , foo.txt , foo , txt

여기 서basename명령 을 사용 하면 접 두 사 를 포함 하 는 파일 이름 을 직접 얻 을 수 있 고dirname명령 은 경로 이름 을 얻 을 수 있 으 며,그 다음 에 간단하게 cut 로 파일 이름과 접 두 사 를 캡 처 할 수 있 습 니 다.
더 복잡 한 상황
간단 한 응용 장면 에 대처 하면 여기까지 작업 을 마 칠 수 있 습 니 다.그러나 가끔 은 파일 에 하나의 접미사 만 있 는 것 이 아 닐 수도 있 습 니 다.예 를 들 어*.tar.gz 는 어떻게 마지막 접 두 사 를 얻 습 니까?다시 잘라 볼 까?물론 입 니 다.하지만 파일 이름 이 my lib.1.0.1a.zip 이 라면 요?어...정규 표현 식 은 가능 할 거 야.
$ fullname=mylib.1.0.1a.zip
$ filename=$(echo $fullname | sed 's/\.[^.]*$//')
$ extension=$(echo $fullname | sed 's/^.*\.//')
$ echo $filename, $extension
mylib.1.0.1a, zip

이 안의 논 리 는 이렇다.
  • 파일 이름:.문자 로 시작 한 후 줄 끝 까지 비.문자 의 하위 문자열 을 비 웁 니 다.
  • 접미사 이름:줄 의 첫머리 부터.문자 로 끝 나 는 하위 문자열 을 비 웁 니 다.

  • 말로 만 이 두 정규 표현 식 을 묘사 해도 뇌 세포 가 많이 죽는다.위 컷 버 전 처럼 쉽게 이해 할 수 있 는 방법 없 을까요?.구분자 의 개수 가 확실 하지 않 기 때문에 마지막.문 자 를 잘라 내 는 것 은 불가능 합 니 다.그러나 우 리 는rev명령 을 사용 하여 문자열 을 반전 시 키 고 접미사 와 파일 이름 을 구분 하 는.문자 의 위 치 를 확정 할 수 있 습 니 다.원 하 는 부분 을 캡 처 한 후 다시 반전 하면 우리 가 원 하 는 내용 을 얻 을 수 있다.
    $ fullname=mylib.1.0.1a.zip
    $ filename=$(rev <<< $fullname | cut -d . -f2- | rev)
    $ extension=$(rev <<< $fullname | cut -d . -f1 | rev)
    $ echo $filename, $extension
    mylib.1.0.1a, zip

    매개 변수 확장 사용
    복잡 한 정규 표현 식 을 빌 리 지 않 고 basename,dirname,cut,sed 명령,셸 스 크 립 트 처럼 모든 작업 을 할 수 있 습 니 다.아래 의 실현 을 보면:
    $ fullfile=/the/path/mylib.1.0.1a.zip
    $ fullname="${fullfile##*/}"
    $ dir="${fullfile%/*}"
    $ extension="${fullname##*.}"
    $ filename="${fullname%.*}"
    $ echo $dir , $fullname , $filename , $extension
    /the/path , mylib.1.0.1a.zip , mylib.1.0.1a , zip

    더 이상 간결 할 수 없습니다.대괄호 안에 있 는 변수 이름 이 몇 개의 신기 한 문자 와 결합 하 는 것 이 바로 Shell 의 매개 변수 확장Parameter Extension기능 입 니 다.
  • ${fullfile##*/}:앞에서 부터 fullfile 에서 최대 일치 하 는 문자열(longest matching pattern)*/을 삭제 합 니 다
  • ${fullfile%/*}:fullfile 에서 최소 일치 하 는 문자열(shortest matching pattern)/*을 뒤에서 삭제 합 니 다
  • ${fullname##*.}:앞에서 부터 fullname 에서 최대 일치 하 는 문자열(longest matching pattern)*.을 삭제 합 니 다
  • ${fullname%.*}:fullname 에서 최소 일치 하 는 문자열(shortest matching pattern).*을 뒤에서 삭제 합 니 다
  • 매개 변수 확장 은 여러 가지 형식 이 있 습 니 다.셸 프로 그래 밍 에서 매개 변수의 조합,문자열 의 교체,매개 변수 목록 캡 처,변수 초기 값 등 으로 사용 할 수 있 습 니 다.여기 서 자세히 설명 하지 않 습 니 다.뒤의 기능 목록 과공식 문서을 참고 하 십시오.
    매개 변수 확장 기능 목록
    매개 변수 형식
    확장 후
    x{y,z}
    xy xz
    ${x}{y, z}
    ${x}y ${x}z
    ${x}{y, $z}
    ${x}y ${x}${z}
    ${param#pattern}
    param 앞에서 pattern 의 최소 일치 삭제
    ${param##pattern}
    param 앞에서 pattern 의 최대 일치 삭제
    ${param%pattern}
    param 뒤에서 pattern 의 최소 일치 삭제
    ${param%%pattern}
    param 뒤에서 pattern 의 최대 일치 삭제
    ${param/pattern/string}
    param 에서 pattern 을 string 으로 바 꾸 는 첫 번 째 일치,string 은 비어 있 습 니 다.
    ${param//pattern/string}
    param 에서 string 으로 pattern 의 모든 일치 성 을 바 꾸 면 string 이 비어 있 습 니 다.
    ${param:3:2}
    $param 에서 색인 3 을 시작 하 는 두 문 자 를 캡 처 합 니 다.
    ${param:3}
    $param 에서 색인 3 에서 끝 까지 의 문 자 를 캡 처 합 니 다.
    ${@:3:2}
    매개 변수 목록$@에서 세 번 째 로 시작 하 는 두 개의 매개 변 수 를 캡 처 합 니 다.
    ${param:-word}
    $param 이 비어 있 거나 설정 되 지 않 으 면 매개 변수 식 으로 워드 를 되 돌려 줍 니 다.$param 은 변 하지 않 습 니 다.
    ${param:+word}
    $param 이 비어 있 지 않 으 면 매개 변수 식 으로 워드 를 되 돌려 줍 니 다.$param 은 변 하지 않 습 니 다.
    ${param:=word}
    $param 이 비어 있 거나 설정 되 어 있 으 면 매개 변수 식 으로 워드 를 되 돌려 주 고$param 은 워드 로 설정 합 니 다.
    ${param:?message}
    $param 이 비어 있 거나 설정 되 어 있 으 면 잘못된 정보 message 를 출력 합 니 다.공백 문자 가 포함 되 어 있 으 면 따옴표 가 필요 합 니 다.

    좋은 웹페이지 즐겨찾기