확장자 전에 파일 이름에 텍스트 추가


25

파일 이름 끝에 확장자 앞에 텍스트를 추가하고 싶습니다. 지금 나는 노력하고 있습니다.

for f in *.shp; do echo $f_poly; done

출력은

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

나는 그것이되기를 원합니다.

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

답변:


27

사용 표준 POSIX 매개 변수 확장 :

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

내가 꼭 필요한 것입니다.
Sam007

1
작동 방식에 대한 설명으로 더 나을 수 있습니다. 반면 Doug의 대답은 매우 쉽습니다.
Sarge Borsch 2016 년

@SargeBorsch 무엇을 설명해야합니까? 내 대답, 질문의 스 니펫 및 Doug의 대답은 몇 자만 다르며 Doug의 대답은 내 것보다 훨씬 적게 설명하므로 원하는 것이 무엇인지 모르겠습니다. 질문에서 두 출력의 차이점을 비교하면 그 결과를 쉽게 이해할 수 있습니다. 왜 내 대답이 Doug보다 선호되는지 설명 할 수 있습니다. 1. printf휴대용이 아닌 형식 문자열을 사용합니다 echo. 2. basename간단한 작업을 위해 외부 바이너리 ( )를 호출하는 것보다 효율적인 매개 변수 확장을 사용 합니다.
jw013

그러면 파일 이름을 바꾸는 명령은 다음과 같습니다.for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

때로는 "이름 바꾸기"라는 도구가 설치되어 있습니다.

rename 's/\.shp$/_poly.shp/' *shp

휴대용이 아니지만 사용하기 쉽습니다.


1
이것은 나를 위해 일한 유일한 사람입니다.
wanderer0810

4

이것을 사용하십시오 :

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
basename쉘을 사용하는 것보다 속도가 느리고 효율성이 떨어집니다. 이것은 매우 많은 수의 파일에서 두드러 질 수 있습니다.
jw013

또한 따옴표와 --s 가 누락 되어 파일 앞에 개행 문자가있는 파일 이름의 경우 실패합니다 .shp.
Stéphane Chazelas

실제로 목적을 위해 작업 할 수있는 답변을 주셔서 감사합니다. 이것은 코드 골프가 아닌 bash 도움말입니다. (이 글을 읽고 .. 나는 그것이 냉소적 인 것처럼 들릴 수 있음을 알고 있습니다. 당신의 것보다 여기에 다른 답변에 더 움켜 쥐고 있습니다. 다시 감사합니다)
Tim

3

이것은 나를 위해 더 잘 작동했습니다.

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


글쎄, 이것은 아마도 당신이 원하는 것을 제외하고는 for f in *.webm따옴표를 잊어 버렸고을 ${f}놓쳤다는 것을 제외하고는 받아 들여진 대답과 매우 비슷합니다 --.
Stéphane Chazelas

1
허용 된 답변은 OSX에서 작동하지 않고 새 파일 이름 만 인쇄하며 실제로 파일 이름을 바꾸지 않습니다.
Vinnie James

1
물론 파일 확장명 (with echo)을 출력 하지만 필수는 아닌 질문에 대한 응답으로 쉘 확장을 사용하여 새 파일 이름을 얻는 방법을 보여줍니다 .
Stéphane Chazelas

1

다른 위치에 있으면 다음을 실행하십시오.

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

문제는 bash regexps를bash 사용할 수 있기 때문에 외부 유틸리티가 필요 없다는 것입니다 .

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.