sourcecode

Bash의 경로 문자열에서 파일 접미사와 경로 부분을 제거하려면 어떻게 해야 합니까?

codebag 2023. 4. 28. 20:33
반응형

Bash의 경로 문자열에서 파일 접미사와 경로 부분을 제거하려면 어떻게 해야 합니까?

다음과 같은 문자열 파일 경로가 지정됩니다./foo/fizzbuzz.bar어떻게 bash를 사용하여 단지 그것을 추출할 수 있습니까?fizzbuzz그 끈의 일부?

다음은 Bash의 # 및 % 연산자로 수행하는 방법입니다.

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

${x%.bar}또한 그럴 수도 있습니다.${x%.*}점이나 점 뒤에 있는 모든 것을 제거하는 것.${x%%.*}첫 번째 점 뒤에 있는 모든 것을 제거합니다.

예:

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

설명서는 Bash 설명서에서 찾을 수 있습니다.찾다${parameter%word}그리고.${parameter%%word}후행 부분 일치 섹션.

basname 명령을 확인합니다.

NAME="$(basename /foo/fizzbuzz.bar .bar)"

▁the▁다▁instruct▁remove를 제거하도록 지시합니다..bar으로 의결과가 됩니다.NAME=fizzbuzz

순수 배시(Pure bash), 두 개의

  1. 경로 문자열에서 경로를 제거합니다.

    path=/foo/bar/bim/baz/file.gif
    
    file=${path##*/}  
    #$file is now 'file.gif'
    
  2. 경로 문자열에서 확장자를 제거합니다.

    base=${file%.*}
    #${base} is now 'file'.
    

기본 이름을 사용하여 이를 달성하기 위해 다음을 사용했습니다.

for file in *; do
    ext=${file##*.}
    fname=`basename $file $ext`

    # Do things with $fname
done;

은 파일 사전 지식이 이 있는 경우에도 작동합니다. 합니다. 프로그램이 필요합니다.basename하지만, 이것은 GNU 코어 유틸리티의 일부이기 때문에 모든 디스트리뷰터와 함께 배송되어야 합니다.

기본 이름 및 dirname 함수는 다음과 같습니다.

mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")

출력 있음:

basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo

순수한 배시 방식:

~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; 
~$ y=${x/\/*\//}; 
~$ echo ${y/.*/}; 
fizzbuzz

이 기능은 manbash의 "매개 변수 확장"에 설명되어 있습니다.비배시 방식: awk, perl, sed 등이 많습니다.

편집: 파일 접미사의 점과 함께 사용할 수 있으며 접미사(확장자)를 알 필요는 없지만 이름 자체의 점과 함께 사용할 수는 없습니다.

용사를 합니다.basename파일 확장자가 무엇인지 알고 있다고 가정합니다. 그렇죠?

그리고 다양한 정규 표현 제안들은 하나 이상의 ""를 포함하는 파일 이름을 처리하지 못한다고 생각합니다.

다음은 이중 점을 처리하는 것으로 보입니다.아, 그리고 "/" 자체가 포함된 파일 이름(장난용)

파스칼의 말을 빌리자면, "죄송합니다. 이 스크립트는 너무 깁니다.더 짧게 만들 시간이 없었습니다."


  #!/usr/bin/perl
  $fullname = $ARGV[0];
  ($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
  ($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
  print $basename . "\n";
 

답변에 사용POSIX 적합 구문 외에도,

basename string [suffix]

에 있어서와 같이

basename /foo/fizzbuzz.bar .bar

GNU는 다른 구문을 지원합니다.

basename -s .bar /foo/fizzbuzz.bar

같은 결과로차이점과 장점은-s함축성이 있는-a여러 인수를 지원합니다.

$ basename -s .bar /foo/fizzbuzz.bar /baz/foobar.bar
fizzbuzz
foobar

하여 출력을 NUL 바이트로 구분함으로써 파일 이름에 안전하게 만들 수 있습니다.-z를 들어 공백,줄 및 문자가 : " 예새 , 줄를및글문자포를는파함일의경우옵션됨하표시quoted의해벌로에▁option,▁charact(▁cont션)옵▁by됨우경,ers표▁and시▁(quoted▁for▁files의▁glob해lines의▁these▁example▁new▁for▁blanksaining파일)ls):

$ ls has*
'has'$'\n''newline.bar'  'has space.bar'  'has*.bar'

배열 읽기:

$ readarray -d $'\0' arr < <(basename -zs .bar has*)
$ declare -p arr
declare -a arr=([0]=$'has\nnewline' [1]="has space" [2]="has*")

readarray -d에는 Bash 4.4 이상이 필요합니다.이전 버전의 경우 루프해야 합니다.

while IFS= read -r -d '' fname; do arr+=("$fname"); done < <(basename -zs .bar has*)
perl -pe 's/\..*$//;s{^.*/}{}'

다른 게시물에서 제안한 바와 같이 기본 이름을 사용할 수 없는 경우에는 언제든지 sed를 사용할 수 있습니다.여기 (못난) 예가 있습니다.최고는 아니지만 원하는 문자열을 추출하고 입력을 원하는 문자열로 대체하여 작동합니다.

echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g'

그러면 출력이 나옵니다.

윙윙거리는 소리

제안된 펄 솔루션에 주의하십시오. 첫 번째 점 뒤에 있는 모든 것을 제거합니다.

$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}'
some

Perl을 사용하여 이 작업을 수행하려면 다음 작업을 수행합니다.

$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'
some.file.with

그러나 Bash를 사용하는 경우 솔루션은y=${x%.*}(또는)basename "$x" .ext확장자를 알고 있는 경우)가 훨씬 더 간단합니다.

기본 이름을 사용하면 경로가 제거됩니다.또한 파일의 접미사와 일치하지만 명령에 제공할 접미사를 알아야 할 경우 접미사를 제거합니다.그렇지 않으면 mv를 사용하여 새로운 이름이 무엇인지 알아낼 수 있습니다.

최상위 응답과 두 번째 최상위 응답을 결합하여 전체 경로 없이 파일 이름을 가져옵니다.

$ x="/foo/fizzbuzz.bar.quux"
$ y=(`basename ${x%%.*}`)
$ echo $y
fizzbuzz

확장자가 있는 파일 이름만 유지하고 파일 경로를 제거하려는 경우

$ x="myfile/hello/foo/fizzbuzz.bar"
$ echo ${x##*/}
$ fizzbuzz.bar

Bash 설명서의 설명은 다음을 참조하십시오.${parameter##word}

사용할 수 있습니다.

mv *<PATTERN>.jar "$(basename *<PATTERN>.jar <PATTERN>.jar).jar"

예:- 제거하고 싶었습니다.-SNAPSHOT내 파일 이름에서.아래 명령에 사용되는 경우

 mv *-SNAPSHOT.jar "$(basename *-SNAPSHOT.jar -SNAPSHOT.jar).jar"

언급URL : https://stackoverflow.com/questions/125281/how-do-i-remove-the-file-suffix-and-path-portion-from-a-path-string-in-bash

반응형