다음 이름을 가진 여러 파일이 포함된 디렉터리가 있습니다.
- 일반 이름 - 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/' *
: 모든 파일의 이름을 변경*
합니다( ). 정규식foo
을bar
.[^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