как зациклить файлы в Linux из статуса SVN - PullRequest
4 голосов
/ 14 ноября 2008

Как новичок в Linux, у меня следующий вопрос. У меня есть список файлов (на этот раз в результате состояния SVN), и я хочу создать сценарий, чтобы зациклить их все и заменить вкладки с 4 пробелами.

Итак, я хочу от

....
D      HTML/templates/t_bla.tpl
M      HTML/templates/t_list_markt.tpl
M      HTML/templates/t_vip.tpl
M      HTML/templates/upsell.tpl
M      HTML/templates/t_warranty.tpl
M      HTML/templates/top.tpl
A  +   HTML/templates/t_r1.tpl
....

к чему-то вроде

for i in <files>; expand -t4;do cp $i /tmp/x;expand -t4 /tmp/x > $i;done;

но я не знаю, как это сделать ...

Ответы [ 5 ]

16 голосов
/ 14 ноября 2008

Вы можете использовать эту команду:

svn st | cut -c8- | xargs ls

Это обрезает первые 8 символов, оставляя только список имен файлов без флагов Subversion. Вы также можете добавить grep перед cut, чтобы отфильтровать только некоторые изменения, например /^M/. xargs передаст список файлов в качестве аргументов данной команде (ls в данном случае).

3 голосов
/ 14 ноября 2008

Не запрашиваю ни одного голоса, но для отчета я выложу объединенный ответ от @ Adam Byrtek и @ Dan Fego :

svn st | cut -c8- | xargs sed -i 's/\t/    /'
3 голосов
/ 14 ноября 2008

Я бы использовал sed, вот так:

for i in files
do
    sed -i 's/\t/    /' "$i"
done

В этом большом блоке есть четыре пробела. ; -)

Я не проверял это, но оно должно работать. И я бы сделал резервную копию ваших файлов на всякий случай. Флаг -i означает, что он будет выполнять замену файлов на месте, но если он испортится, вы захотите восстановить их.

Предполагается, что $ files содержит имена файлов. Однако вы также можете использовать подход Адама при получении имен файлов, просто используйте приведенную выше команду sed без «$ i».

2 голосов
/ 14 ноября 2008

Я не мог проверить это с реальным выводом Subversion, но это должно сделать работу:

svn st | cut -c8- | while read file; do expand -t4 $file > "$file-temp"; mv "$file-temp" "$file"; done

svn st | cut -c8- создаст список файлов без флагов подрывной деятельности. read сохранит каждую запись в переменной $file, а expand используется для замены вкладок четырьмя пробелами в каждом файле.

0 голосов
/ 14 ноября 2008

Не совсем то, что вы спрашиваете, но, возможно, вам следует изучить хуки коммитов в Subversion?

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

В каталоге репо на вашем сервере Subversion будет каталог, называемый хуками. Поместите туда что-нибудь исполняемое, называемое pre-commit, и оно будет запущено до того, как будет разрешено что-либо зафиксировать. Он может вернуть статус, чтобы заблокировать фиксацию, если хотите.

Вот что мне нужно, чтобы остановить файлы php с проверкой синтаксических ошибок:

#!/bin/bash
REPOS="$1"
TXN="$2"
PHP="/usr/bin/php"

SVNLOOK=/usr/bin/svnlook

$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null

if [ $? -ne 0 ]
then
  echo 1>&2
  echo "You must enter a comment" 1>&2
  exit 1
fi


CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | awk '{print $2}'`

for LINE in $CHANGED
  do
  FILE=`echo $LINE | egrep \\.php$`
  if [ $? == 0 ]
    then
    MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "${FILE}" | $PHP -l`
    if [ $? -ne 0 ]
      then
      echo 1>&2
      echo "***********************************" 1>&2
      echo "PHP error in: ${FILE}:" 1>&2
      echo "$MESSAGE" | sed "s| -| $FILE|g" 1>&2
      echo "***********************************" 1>&2
      exit 1
    fi
  fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...