2012-04-02 2 views

답변

0

나는 일반 표현식을 사용하여 TortoiseSVN이있는 디렉토리에있는 모든 파일의 이름을 바꿀 수 있습니까?

번호 SRC와 svn move에서 DST가 은 트리밍을 수행 할 수있는 경우 문자열

상수, 당신은 어쨌든 SVN 명령 내부 결과를 사용하려고하지만, 수 - 그렇지 않다 게임의 SVN 부분

1

Tortoise 자체에서는 아니지만 Subversion 클라이언트의 명령 줄 버전을 사용하여 다양한 셸 스크립트에서 수행 할 수 있습니다.

$ find . \(-name ".svn" -prune -false \) -o -type f | while read file 
    do 
     newFile=${file%??} 
     svn mv $file $newFile 
    done 

당신은 당신이 먼저 .NET을 설치해야 할 수도 있지만 지금은 (대부분의 Windows 플랫폼에 포함되어 PowerShell을 사용하여 비슷한 작업을 수행 할 수 있습니다 쉘에서는이 같은1일 것). 나는 Powershell을 정말로 모르는 것을 제외하고는 그 구문을 제공 할 것입니다.

이것은 사람들에게 Subversion 명령 줄을 배우게하는 이유 중 하나입니다. Subversion의 기능을 크게 확장하여 이와 같은 작업을 수행 할 수 있습니다. 기초하고 정확하다는 암시 적 보증이 없기 때문에

1구문


에 기재되어 있습니다. 사용자는 상기 구문을 실행하기위한 모든 책임을진다. 심사위 원단의 모든 결정은 최종 결정입니다. 법으로 금지 된 곳에서는 무효가됩니다.

+0

Subversion을 설치할 수없는 경우 기존에 설치된 TortoiseSVN 클라이언트에 설치할 수 있습니까? – SSS

+0

TortoiseSVN 1.7을 이미 사용하고 있다면 Subversion 명령 줄 유틸리티가 있으므로 아무 것도 설치할 필요가 없습니다. TortoiseSVN 아래 bin 디렉토리를 확인하십시오. David의 스크립트 (즉,'find' 명령)는 Windows가 아닌 Linux/Unix 용입니다. –

1

는 DavidW의 대답 @ 위로 다음, 여기에이 작업을 수행하는 기본 PowerShell을 순서입니다 :

Get-ChildItem . | % { svn mv $_.name ($_.name -replace '..\.','.') } 

이이 문제의 특정 샘플 작동하지만 여기서 파일 이름은 코너 케이스에 실패합니다 여러 개의 점들이 들어 있습니다. "ProjectX.MyFileXY.c"와 같은 것입니다. 아래 두 개의 정규 표현식 중 하나가 더 강력하고 여러 점을 처리합니다 (이 신속/정규 표현식을 테스트 단독으로 작업을 대체하는 방법을 보여줍니다) : 질문 만의 파일을 처리하기위한 요구

"ProjectX.MyFileXY.c" -replace '..\.(?=[^.]*$)','.' 
"ProjectX.MyFileXY.c" -replace '..(\.[^.]*?)$','$1' 

있지만 현재 디렉토리에 데이비드가 포함되어 있으므로 병렬 처리를 위해 내 솔루션을 일반화해야한다고 생각했습니다.

Get-ChildItem . -Recurse -NoContainer | 
    % { svn mv $_.name ($_.name -replace '..\.(?=[^.]*$)','.') } 

하지만이 : 일반적인 솔루션 - - 현재 디렉토리를 루트로하는 서브 트리를 검사하는 (나는 또한 여기에보다 강력한 정규식 등에서 특정 요소를 뽑아 오기 중 하나를 교체 한)-ChildItem을 얻기 위해 단지 몇 가지 매개 변수를 추가 필요 prune private .svn 디렉토리가 아닙니다. David는 Linux find 명령을 사용하여 수행했습니다. Get-ChildItem에는 그러한 옵션이 없으므로 몇 가지 추가 매개 변수가 포함 된 내 오픈 소스 라이브러리 (here)에 향상된 버전 (Get-EnhancedChildItem)을 추가했습니다. -ExcludeTree-prune하는 것과 같습니다

마지막으로
Get-EnhancedChildItem . -ExcludeTree .svn -Recurse -NoContainer | 
    % { svn mv $_.name ($_.name -replace '..\.(?=[^.]*$)','.') } 

, 내 강화 된 cmdlet을 그냥 Subversion의 개인 디렉토리를 무시하지하기 위해 사용될 수있다 오히려 파괴를받지 않는 어떤 파일을 무시도 하나 추가 옵션 (-Svn)를 제공 소스 제어 :

Get-EnhancedChildItem . -Svn -Recurse -NoContainer | 
    % { svn mv $_.name ($_.name -replace '..\.(?=[^.]*$)','.') } 
+0

감사합니다. 나는 PowerShell 응답을했을 텐데, 나는 지난 목요일에 그것을 배우기 시작했고 아마이 단일 작업을 위해 그것을 사용할 것이고 다시는 사용하지 않을 것이다. 분명히 CMD 셸 구문보다 낫지 만 Python이나 Perl을 사용하고 싶습니다. –

관련 문제