두 지점 사이의 텍스트를 제거하여 일련의 동영상 이름을 바꾸는 방법을 찾고 있습니다. 구체적으로는 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
: 이 형식은 정규식을 검색하여bar
glob과 일치하는 모든 파일에서 작동합니다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"에 대한 구문은 *
대신 입니다 .*
.)