다음 형식의 파일이 있습니다.
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