파일 이름의 일부를 추출하시겠습니까?

파일 이름의 일부를 추출하시겠습니까?

다음 형식의 파일이 있습니다.

XXX XXXX XXX-6VwvOkZvzuI.description

파일 이름만 어떻게 얻을 수 있나요 XXX XXXX XXX? 나는 시도했다:

for file in $(ls .d*)
do
    fname="${file%*-}"
    ext="${filename%.*}"
done

답변1

구문 분석하지 마십시오 ls(예:왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?). 문제는 루프 변수가 file모두 하나의 긴 문자열로 연결된 후 파일 이름 값을 가져온 다음 공백으로 분할한다는 것입니다(그리고 분할 단어 후에). 와일드카드 패턴에는 확장자가 있습니다. ). 파일 이름 loop 는 세 번 반복됩니다 XXX XXXX XXX-6VwvOkZvzuI.description(예: value XXX와 loop XXXX각각 하나씩 ) XXX-6VwvOkZvzuI.description.

이름에 대시와 .description사용된 파일 이름 접미사가 포함된 모든 파일을 반복합니다.

for name in *-*.description; do ...; done

-에서 앞 부분을 선택하려면 표준 매개변수 확장을 사용하여 문자열에서 첫 번째 부분 뒤의 모든 항목을 $name제거합니다 .-

prefix=${name%%-*}

%%using과 여기서의 차이점 %은 다음과 같습니다.%%가장 긴일치하는 후행 문자열이 제거됩니다. 이름에 두 개 이상의 문자가 포함된 경우 -이는 중요합니다 .

그러면 루프는

for name in *-*.description; do
    prefix=${name%%-*}
done

.description파일 이름 접미사는 알려져 있지만( )을 사용하여 파일 이름 비트를 접미사로 가져올 수 있습니다.-

infix=${name#"$prefix"}
infix=${infix%.description}

마지막으로 다음과 같은 스크립트를 사용하십시오.

#!/bin/sh

suffix=.description

for name in *-*"$suffix"; do
    prefix=${name%%-*}
    infix=${name#"$prefix"}
    infix=${infix%.description}

    printf 'prefix="%s", infix="%s", suffix="%s"\n' \
        "$prefix" "$infix" "$suffix"
done

당신은 얻을 것이다

$ ls
XXX XXXX XXX-6VwvOkZvzuI.description          XXX XXXX XXX-6VwvOkZvzuK.description
XXX XXXX XXX-6VwvOkZvzuJ.description          script
$ ./script
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuI", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuJ", suffix=".description"
prefix="XXX XXXX XXX", infix="-6VwvOkZvzuK", suffix=".description"

답변2

이 시도

$ ls -1
x.sh
XXX XXXX XXX-6VwvOkZvzuI.description
YYY XXXX XXX-6VwvOkZvzuI.description
$ cat x.sh
#!/bin/bash
for file in *.d*
do
 fname=${file/-*/}
 ext=${file/*-/}
 echo fname $fname ext $ext
done
$ ./x.sh
fname XXX XXXX XXX ext 6VwvOkZvzuI.description
fname YYY XXXX XXX ext 6VwvOkZvzuI.description
$

답변3

편집하다

내 답변은 유지하지만 @Kusalananda의 답변에 경고를 추가합니다. 구문 분석하지 마세요 ls(예: 왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?).

내 대답

ls의 출력을 sed로 직접 파이프하고 -하이픈( ) 앞 부분만 바꿀 수 있습니다.

ls *.d* | sed 's/\(.*\)-.*/\1/'

나는 다음과 같은 두 개의 파일을 사용해 보았습니다.

XXX XXXX XXX-6VwvOkZvzuI (copy).description
XXX XXXX XYZ-6VwvOkZvzuI.description

출력은 다음과 같습니다

XXX XXXX XXX
XXX XXXX XYZ

sed 명령은 다음과 같이 작동합니다.

  • 위에서 between 을 사용한 것을 기억합니다 \(. \)이 경우 모든 것은 다음에 달려 있습니다.마지막파일 이름의 하이픈(파일 이름 뒤에 하이픈이 포함된 경우 조정해야 함)
  • 그런 다음 기억하는 것으로 바꾸십시오 \1. 즉, XXX 부분만

필요한 경우 명령 출력을 파일에 넣을 수 있습니다.

ls *.d* | sed 's/\(.*\)-.*/\1/' > new_file

관련 정보