다음 형식의 파일이 있습니다.
filename1 1 extra1.ext filename1 2.ext filename1 3 extra2.ext ... filename2 1.ext filename2 100 extra3.ext ... filename20 1.ext filename20 15 extra100.ext (etc.)
...where filename1
등에 는 filename2
공백과 숫자, 문자, , 및 기호가 포함될 수 있지만 [
공백 ]
안에 숫자 는 포함될 수 없습니다. And 등에 는 무엇이든 포함될 수 있습니다. 파일 이름에서 공백으로 묶인 숫자는 반복되지 않습니다 .(
)
'
extra1
extra2
filename1
filename2
내가 원하는 것은 그것을 포함하는 파일의 추가 내용을 제거하는 것입니다. 즉, 에서 filename20 15 extra100.ext
까지filename20 15.ext
또한 디렉터리의 콘텐츠를 반복해야 하므로 추가 콘텐츠가 있는 파일과 이름 바꾸기 방법을 적용하는 파일을 구별해야 합니다.
가능합니까? 방금 Windows에서 Linux로 옮겼고 배치 스크립트가 있지만 bash에서 시작하는 방법을 모르겠습니다.
인사,
답변1
(perl)을 사용하여 이름을 바꿉니다. 명령은 다음과 같습니다.
rename 's/( [0-9]*) .*\.ext/$1.ext/' *
Linux 배포판은 일반적으로 두 가지 rename
버전으로 제공됩니다. 기본값은 일반적으로 더 간단한 버전입니다. Perl 기반 이름 바꾸기는 정규식에 대한 액세스를 제공하므로 더욱 강력합니다. 후자를 사용하고 있는지 확인하세요. (배포판을 언급하지 않았지만 Arch에서는 package 에서 제공됩니다 perl-rename
.)
먼저 테스트해보세요
파일을 만듭니다(마지막에 추가 파일을 추가했습니다).
$ touch 'filename1 1 extra1.ext' 'filename1 2.ext' 'filename1 3 extra2.ext' 'filename2 1.ext' 'filename2 100 extra3.ext' 'filename20 1.ext' 'filename20 15 extra100.ext' 'filename3 1 3 4 .ext'
테스트 명령
$ rename 's/( [0-9]*) .*\.ext/$1.ext/' * -n
filename1 1 extra1.ext -> filename1 1.ext
filename1 3 extra2.ext -> filename1 3.ext
filename20 15 extra100.ext -> filename20 15.ext
filename2 100 extra3.ext -> filename2 100.ext
filename3 1 3 4 .ext -> filename3 1.ext
결과가 만족스러우면 "시험 실행"/테스트 플래그를 제거 -n
하고 실제로 실행해 보세요.
설명하다
rename 's/foo/bar/' *
: perl rename은 정규식을foo
로 대체합니다bar
. 이는*
현재 디렉토리의 모든 파일에 적용됩니다. 또한 이를 명시적으로 대체하여*.ext
작동하는 파일을 제한할 수도 있습니다./( [0-9]*) .*\.ext
: 공백, 숫자 문자열,[0-9]*
또 다른 공백이 차례로 나오는 문자열과 일치합니다. 나중에 다시 사용할 수 있도록 캡처링 그룹의 첫 번째 공백과 숫자를 묶습니다( [0-9]*)
. 그런 다음.*
확장자를 포함하여 모든 항목을 일치시킵니다\.ext
. 이 정규 표현식은 "탐욕적"이므로 가능한 한 많은 문자를 일치시키려고 합니다. 즉,extra
파일 이름 부분에 공백으로 둘러싸인 숫자가 있으면 일치됩니다./$1.ext
이 일치하는 부분을 위의 캡처 그룹($1
공백, 숫자, 확장자 ) 으로 바꿉니다.ext
.