두 지점 사이의 파일 이름 바꾸기

두 지점 사이의 파일 이름 바꾸기

두 지점 사이의 텍스트를 제거하여 일련의 동영상 이름을 바꾸는 방법을 찾고 있습니다. 구체적으로는 6번째 문자 이후 마지막 "LabelMe--"까지 모두 제거하고 싶습니다.

0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov

0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov

0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov

Apple의 Automator 서비스를 사용하여 이 작업을 수행하려고 합니다. 여러 파일을 마우스 오른쪽 버튼으로 클릭하고 이름을 정리하려는 서비스를 선택하십시오. 코드 조각을 찾았지만 올바르게 사용하고 있는지 잘 모르겠습니다.

for f in "$@"
do 
    echo sed -e 's/\(--LabelMe).*\(LabelMe--)/\1\2/'
done

여기에 이미지 설명을 입력하세요.

답변1

(perl)을 사용하여 이름을 바꿉니다. Apple에 대해서는 잘 모르지만 대부분의 Linux 배포판에는 두 가지 버전의 이름 변경이 함께 제공됩니다. Perl 이름 바꾸기가 더 강력한 것입니다.

-n먼저, "모의 실행"을 수행하고 변경 사항을 적용하지 않는 이 플래그를 사용하여 명령을 실행합니다 .

$ rename 's/(.{6}).*LabelMe--/$1/' 000* -n
0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov -> 1110_C --Interview--Man in library.mov
0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov -> 1110_C --Broll--Man looking at books.mov
0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov -> messed --Broll--Sitting at table.mov

결과에 만족하면 실제로 실행할 수 있습니다.rename 's/(.{6}).*LabelMe--/$1/' 000*

설명하다

  • rename 's/foo/bar/' 000*foo: 이 형식은 정규식을 검색하여 barglob과 일치하는 모든 파일에서 작동합니다 000*.
  • (.{6}).*LabelMe--: 검색하고 있는 정규식입니다. 6명의 캐릭터를 찾아 .{6}캡처 그룹에 넣습니다 (.{6}). 그 후에는 .*보기 전에 어떤 문자든 가질 수 있습니다 LabelMe--.
  • $1: 위의 문자열로 대체할 내용입니다. $1위 일치그룹의 내용을 참조합니다 . (.{6})나머지는 대체되지 않습니다. 즉, 처음 6자를 삭제한 이후까지의 모든 내용입니다 LabelMe--.

답변2

이 사이트에는 쉘 루프를 사용하여 파일 이름을 바꾸는 것에 대한 많은 질문이 있으며 사용에 대한 몇 가지 질문이 있습니다 sed. (예를 들어이것,이것)

sed다음과 같이 명령 대체를 사용하여 파일 이름을 파이프하고 결과를 캡처 해야 합니다 .

mv "$f" "$(echo "$f" | sed -e '...' )"

사용 중인 명령을 sed수정해야 합니다. 먼저 여는 괄호를 인용했지만 닫는 괄호는 인용하지 않았기 때문에 그룹화가 작동하지 않습니다. 또한 왜 LabelMe조각을 파일 이름에 다시 넣으 려는지 잘 모르겠습니다 . 제거하려면 그룹화 및 \N인용을 건너뛰세요.

's/--LabelMe.*LabelMe--//'

전부:

for f in "$@"
do 
    mv "$f" "$(echo "$f" | sed -e 's/--LabelMe.*LabelMe--//' )"
done

또 다른 방법은 쉘의 매개변수 대체를 사용하여 동일한 작업을 수행하는 것입니다. 이 대체는 ${par/pattern/replacement}비표준이지만 많은 셸에서 지원됩니다.

for f in "$@"
do 
    mv "$f" "${f/--LabelMe*LabelMe--/}"
done

(이것은 정규 표현식이 아니므로 "anything"에 대한 구문은 *대신 입니다 .*.)

관련 정보