어떻게 Bash에서 파일 이름에 후행 문자를 제거 하시겠습니까?


13

나는 아래와 같은 미디어 파일들을 가지고있다.

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

나는 그들에게 이름을 바꾸고 싶다.

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

나는 이름 바꾸기를 사용하여 시도했지만 분명히 실패했기 때문에 문법을 제대로 이해하지 못하고있다.


당신이 gui에서 이것을하고 싶다면, krename 사랑 스럽다. 그것은 모든 종류의 강력한 옵션을 가지고 있으며 실제로 그것을하기 전에 할 일을 보여줍니다. 나중에 bash에서 사용할 수있는 패턴을 테스트하는 데 사용할 수도 있습니다.
Joe

답변:



14

셸에서는 간단히 할 수 있습니다.

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

쉘은 정규 glob로 파일 이름 목록을 생성 할 수 있습니다. ${var%pattern} 변수의 문자열 끝에있는 (가장 짧은) 일치하는 패턴을 제거합니다. var. 최종 확장은 항상 이후 .avi, 방금 패턴으로 제거하고 다시 추가했습니다. 따옴표를 사용하면 파일 이름에도 공백이 포함될 수 있습니다. Fancy Name for a Show.s01e01]Asdf.avi


@NoviceC extglob 패턴은 나쁜 생각이 아니 었습니다. 사실, ${x/]*([^.])} 해야 할 일은 괄호와 여러 개의 점이 아닌 점을 제거하는 것입니다. (문자열의 끝에 고정되어 있지 않으므로 다른 대괄호 나 점이 있으면 실패합니다)
ilkkachu

그건 좋은 지적이야. 그러나 내가 함께 가야했을 때 문제를 너무 복잡하게 만들었습니다. ${x/]*.avi} 방금 .avi 너 같이. 그러나 나는 또한 이름 공간이 어떻게 깨지는 지에 만족하지 못했다. (`find . -name '*]*.avi'`). 나는 이름 변경이 아니기 때문에 제한된 표준 유닉스 명령 방법을 제공하게되어 기뻤지 만, 이것은 물 밖으로 광산을 날려 버린다.
Novice C

2

이것은 모든 종류의 비실용적입니다 - 다른 답변은 훨씬 더 빠르며 더 짧습니다 -하지만 ...

PowerShell을 사용할 수 있습니다! 마이크로 소프트 그것을 오픈 소스했다. 최근에 그것을 크로스 플랫폼으로 만들었습니다. OS의 다운로드 및 설치 지침은 다음을 참조하십시오. "PowerShell 가져 오기"절 .

일단 설치하면 다음과 같은 간단한 스크립트를 사용할 수 있습니다.

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

기본적으로, 그것은 일치하는 파일 인 현재 디렉토리의 각 객체를 거칩니다. *]*.avi브래킷 앞 부분을 잡아 당김 .avi 다시 그 위에 새 이름으로 할당합니다.

Bash에서 직접 실행하려면 다음과 같이 반 골프 한 줄을 사용하십시오.

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

견적 이스케이프 호의 이 스택 오버플로 대답 .

(Windows의 Ubuntu에서 Bash로 테스트했는데, PowerShell을 사용하면 훨씬 더 짧은 방법 일 것입니다.하지만 정규식을 모르는 사람들이 이해할 수있는 것을 보여주고 싶습니다.)


Rube Goldberg는 자랑스러워 할 것입니다! Regexes는 배울 진정한 PITA이지만, 여러 번 사용할 가치가 있습니다. 초보적인 수준에서도 사용할 수 있습니다.
Joe

1

데비안에는 mmv 다른 배포판에서도 사용할 수 있으며 소스가 아닌 경우 쉽게 컴파일 할 수 있어야합니다. 다음과 같이 작성할 수 있습니다.

mmv '*]*.avi' '#1.avi'

당신은 우분투 맨 페이지 자세한 내용은이 명령을 참조하십시오.


0

이렇게하면 패턴을 검색하고 sed를 사용하여 텍스트를 바꿉니다.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.