Автоматическое добавление SVN командной строки с пробелами - PullRequest
3 голосов
/ 24 октября 2011

У меня есть хранилище SVN.У меня есть скрипт shell / bash, который предназначен для автоматического добавления всех неверсионных файлов в хранилище.Это выглядит так:

 svn status | grep '^?' | sed 's/^.* /svn add /' | bash;

, который работает отлично, за исключением случаев, когда один из моих новых файлов имеет пробел в имени файла.Как я могу изменить эту команду, чтобы справиться с этим?

Ответы [ 4 ]

4 голосов
/ 24 октября 2011

Чтобы избежать проблем с кавычками, следует избегать вызова оболочки и использовать вместо них xargs, что также ускорит процесс:

svn status | grep '^?' | sed -e 's/^? *//' | xargs --no-run-if-empty -d '\n' svn add

Это будет обрабатывать большинство специальных символов, но не работает для того, чтобы экранировать символы новой строки, но так как это разделитель записей для статуса svn и grep, вы все равно не получите намного лучше.

3 голосов
/ 25 октября 2011

Странно, что вы используете скрипт, потому что svn add --force . может сделать это в одиночку:

> svn status
?       INSTALL
?       trunk/INSTALL
?         trunk/INSTALL WITH SPACE
> svn add --force .
A         trunk/INSTALL
A         INSTALL
A         trunk/INSTALL WITH SPACE

Больше нет суеты с пробелами: -)

1 голос
/ 24 октября 2011

В основном,

echo -e "? a b c'd'\n? b a" | sed -e "s/'/'\\\\''/g" -e "s/^. /svn add '/" -e 's/$/'\''/'

должно работать.

Эта команда echo предназначена для имитации «наихудшего выхода» svn status. Таким образом, вы должны заменить полную команду echo на svn status | grep '^?'. IOW, вы получаете

svn status | grep '^?' | sed -e "s/'/'\\\\''/g" -e "s/^. /svn add '/" -e 's/$/'\''/' | bash

Объяснение: Если вы поместите все имена файлов в ' ... ', вам нужно только следить за ' s в именах файлов. Вы заменяете их на '\'', заканчивая строку, вставляя необработанный ' и перезапуская новую строку.

Чтобы сделать это, вы заменяете каждый ' на '\'', а затем вы вводите имя файла в '...'.

Таким образом, имя файла a b c'd' попадает в компоненты 'a b c', \', 'd' и \', поэтому оно равно 'a b c'\''d'\'. Код выше добавляет пустой '', но это не повредит.

0 голосов
/ 24 октября 2011

Это должно работать для пробелов:

svn status | grep '^?' | sed 's/^.* \(.*\)$/svn add "\1"/' | bash;

Однако у вас все еще будут проблемы с кавычками и другими символами.

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