Как я могу пакетно переименовать файлы в нижний регистр в Subversion? - PullRequest
7 голосов
/ 29 ноября 2010

Мы запускаем Subversion на сервере Linux. Кто-то в нашей организации переписал около 3 тыс. Файлов со смешанным регистром, когда все они должны быть в нижнем регистре.

Это работает в CLI

rename 'y/A-Z/a-z/' *

Но, очевидно, испортит подрывную деятельность.

svn rename 'y/A-Z/a-z/' * 

Не работает, потому что Subversion по-разному работает с переименованиями. Так как я могу сделать это как пакетную работу? Я сосу с CLI, поэтому, пожалуйста, объясните это, как будто я ваши родители. Переименование всех файлов 3k вручную - это не та задача, которую я хочу выполнить.

Спасибо

Ответы [ 3 ]

7 голосов
/ 29 ноября 2010
for src in *; do
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]')
    [ "$src" = "$dst ] || svn rename "$src" "$dst"
done

Как это работает:

  1. Цикл по имени файла источника.
  2. Имя файла назначения - это имя файла источника в нижнем регистре.tr выполняет символьные переводы.
  3. Если имена файлов источника и назначения совпадают, мы в порядке, иначе svn переименовывается.Вместо этого вы можете использовать оператор if, но для однострочных условных выражений довольно часто используется ||.

Если вам нужна рекурсия, вы можете создать небольшой скрипт svn-lowername.sh (небольшой вариантвыше):

#!/bin/bash
for src; do
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]')
    [ "$src" = "$dst" ] || svn rename "$src" "$dst"
done

Обязательно chmod +x svn-lowername.sh.Затем выполните:

find -name .svn -prune -o -type f -print0 | xargs -0 ./svn-lowername.sh

Если вы думаете, что эта проблема может повториться, спрятайте svn-lowername.sh на своем пути (~/bin/ может быть хорошим местом), и вы можете потерять префикс ./, когдазапустить его.

Вы также можете использовать svn-lowername.sh только на одном режиссере, как это:

./svn-lowername.sh *
1 голос
/ 29 ноября 2010

Переименование в Subversion требует двух шагов: svn copy, за которым следует svn delete, если вы хотите сохранить историю. Если вы используете svn move, вы потеряете историю файла.

Хотя этот ответ не поможет с вашим вопросом, он поможет предотвратить повторение этого. Реализуйте сценарий case-insenstive.py в своем хуке перед фиксацией в вашем хранилище Subversion. В следующий раз, когда кто-то попытается добавить файл с другим регистром, ловушка предварительной фиксации не позволит им.

1 голос
/ 29 ноября 2010

Это немного странно, но должно работать с любым количеством вложенных каталогов:

find -mindepth 1 -name .svn -prune -o -print | (
    while read file; do
        svn mv "$file" "`perl -e 'print lc(shift)' "$file"`"
    done
)

Кроме того, вы можете просто отменить их коммит.Управление подсказкой на четыре может быть разумным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...