어떻게 Bash에서 파일 이름에 후행 문자를 제거 하시겠습니까? 가지고있다. tvshow.s01e11]Bloodlines.avi tvshow.s01e12]suffer.avi tvshow.s01e13]NotMe.avi 나는 그들에게 이름을

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

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

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

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

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



답변

그러면 파일의 이름이 바뀝니다. 원하는 수의 영숫자를 나타내려면 \ w *가 필요합니다.

rename 's/\]\w*//' *

참고: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards


답변

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

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


답변

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

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을 사용하면 훨씬 더 짧은 방법 일 것입니다.하지만 정규식을 모르는 사람들이 이해할 수있는 것을 보여주고 싶습니다.)


답변

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

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

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


답변

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

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename


답변