펄 이름 바꾸기

펄 이름 바꾸기

다음 이름을 가진 여러 파일이 포함된 디렉터리가 있습니다.

  • 일반 이름 - dd-01_.txt
  • 일반 이름 - dd-02_.txt
  • 일반명-dd-03_.txt
  • 일반 이름 - dd-04_.txt

다음과 같이 번호와 확장명만 유지하면서 모든 이름을 바꾸고 싶습니다.

  • 01.txt
  • 02.txt
  • 03.txt
  • 04.txt

쉘 스크립트를 사용하여 이 작업을 어떻게 수행할 수 있습니까?

답변1

펄 이름 바꾸기

저는 (perl-)rename을 사용하겠습니다. 배포판은 두 가지 유형의 이름 바꾸기를 제공하므로 Perl 버전의 이름 바꾸기가 설치되어 있는지 확인할 수 있습니다.

$ rename --version
perl-rename 1.9

이를 실행하여 -n"시험 실행"으로 명령을 테스트합니다.

$ rename 's/[^0-9]*([0-9]*).*/\1.txt/' * -n
generic name- dd -01 _.txt -> 01.txt
generic name- dd -02 _.txt -> 02.txt
generic name- dd -03 _.txt -> 03.txt
generic name- dd -04 _.txt -> 04.txt

만족스러우면 명령 자체를 실행하십시오.

$ rename 's/[^0-9]*([0-9]*).*/\1.txt/' *

설명하다

  • rename 's/foo/bar/' *: 모든 파일의 이름을 변경 *합니다( ). 정규식 foobar.
  • [^0-9]*([0-9]*).*[^0-9]*: "캡처 그룹"에 포함된 숫자 뒤에 ([0-9]*)나머지 문자 가 따라오는 숫자가 아닌 모든 문자와 일치합니다 .*. 이는 전체 파일 이름과 일치합니다.
  • \1.txt: 파일 이름을 캡처된 그룹으로 \1바꾸고 .txt.

또 다른 이름 바꾸기

더 간단한 이름 바꾸기를 설치한 경우 비슷한 내용이 표시됩니다.

$ rename --version
rename from util-linux 2.33.1

이 경우 다음 두 가지 명령을 사용할 수 있습니다.

$ rename 'generic name- dd -' '' *
$ rename ' _' '' *

그러나 나는 perl-rename을 배우는 것을 적극 권장합니다.

답변2

아래 패드 중 하나를 사용하여 그렇게 할 수 있습니다. 테스트했습니다. 단, 파일이 위치한 현재 폴더에서 실행해야 합니다.

for file in *generic*.txt; do newname=$(echo $file | awk -F"-" '{print $3}' | sed 's/ _//g'); mv "$file" $newname;done

다른 폴더에서 실행하려면 다음 스크립트를 사용해보십시오.

#!/bin/bash


SRCFLDR=yoursourcefolder
for file in $SRCFLDR/*generic*.txt;do
        newname=$(echo $file | awk -F"-" '{print $3}' | sed 's/ _//g')
        mv "$file" $newname
        echo $file has been renamed to $newname
done

답변3

이 간단한 스크립트는 트릭을 수행해야 합니다.

for f in *[0-9]*.*; do
  base=${f%.*}
  mv -- "$f" "${base//[^0-9]}.${f##*.}"
done

관련 정보