2012-04-02 2 views
0

Можно ли переименовать все файлы в каталоге TortoiseSVN с помощью регулярного выражения?SVN переименовать все файлы в каталоге с помощью регулярного выражения

В основном я хочу вырезать последние два символа имени файла перед расширением.

Например,

MyFileXY.c 
MyOtherFile12.c 

изменено на:

MyFile.c 
MyOtherFile.c 

ответ

0

Могу ли я переименовать все файлы в директории в TortoiseSVN, используя регулярное выражение ?

No. SRC и DST в svn move является строковыми константами

Если ваша оболочка может выполнить такую ​​обрезку, вы можете попытаться использовать результаты внутри команды SVN, но в любом случае - это не SVN часть игры

1

Не в самой черепахе, но вы можете в разных сценариях оболочки использовать версию командной строки Subversion. В Shell, это было бы что-то как это :

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

Вы можете сделать что-то подобное с помощью PowerShell, который теперь работает на большинстве платформ Windows, (хотя, возможно, придется установить .NET первый). Я бы дал вам этот синтаксис, за исключением того, что я действительно не знаю Powershell.

Это одна из причин, по которой я говорю людям, чтобы изучить командную строку Subversion. Он может значительно расширить полномочия Subversion для выполнения таких задач.


Синтаксис дается на как основа и нет неявной гарантии, что это правильно. Пользователь принимает на себя все обязанности по запуску указанного синтаксиса. Все решения судей являются окончательными. Предложение недействительно, если это запрещено законом.

+0

Если у меня нет Subversion, я могу установить его с существующим существующим клиентом TortoiseSVN, который я установил? – SSS

+0

Если у вас есть TortoiseSVN 1.7, у вас уже есть утилиты командной строки Subversion, поэтому вам не нужно ничего устанавливать. Просто проверьте каталог bin под TortoiseSVN. Также обратите внимание, что скрипт Дэвида (т. Е. Команда 'find') предназначен для Linux/Unix, а не для Windows. –

1

Вслед за @ ответ DavidW, вот основная последовательность PowerShell, чтобы сделать это:

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

Это будет работать для конкретных образцов в вопросе, но она не будет выполнена в угловом случае, когда имя файла содержит несколько точек, например что-то вроде «ProjectX.MyFileXY.c». В любом из двух регулярных выражений ниже являются более надежными и будет работать с несколькими точками (это также показывает, как быстро проверить регулярное выражение/заменить операцию в изоляции):

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

Хотя вопрос только просил для обработки файлов в текущий каталог, Дэвид включил обработку потомков, поэтому я подумал, что должен обобщать мое решение и для параллелизма. Общее решение - изучение поддерево с корнем в текущем каталоге - требует добавления всего пару параметров Get-ChildItem (я также местами в одном из более надежных regexs здесь):

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

Но это нет prune private .svn каталоги, как Дэвид сделал с Linux find команда. Поскольку Get-ChildItem не имеет такой опции, я добавил расширенную версию (Get-EnhancedChildItem) в мои библиотеки с открытым исходным кодом (скачать here), которая включает в себя несколько дополнительных параметров; -ExcludeTree эквивалентно -prune:

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

Наконец, мой расширение Командлет предлагает еще одну дополнительную опцию (-Svn), которые могут быть использованы не только игнорировать личную директорию Subversion, а игнорировать любые файлы, которые не под Subversion источник:

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

Спасибо. Я бы сделал ответ PowerShell, но я только начал изучать его в прошлый четверг и, вероятно, буду использовать его для этой отдельной работы и никогда не буду использовать его снова. Это определенно лучше, чем синтаксис оболочки CMD, но я бы предпочел использовать Python или Perl. –

Смежные вопросы