Почему так много людей вызывают grep
в конвейере и либо используют for
петли *1003*, либо xargs
на заднем конце, когда у них есть кровавый awk
прямо всередина вещей?
Сначала давайте избавимся от причудливого использования grep:
svn st | awk '/^?/ { print $2 }'
Поскольку awk
позволяет фильтровать строки на основе регулярных выражений, использование grepсовершенно ненужно.Регулярные выражения awk
ничем не отличаются от grep
(в зависимости от того, какую реализацию awk
и какую из grep
вы используете), так зачем добавлять целый новый процесс и совершенно новое узкое место вpipe?
Оттуда у вас уже есть два варианта, которые будут короче и более читабельными:
# option 1
svn st | awk '/^?/ { print $2 }' | xargs rm -f
# option 2
rm -f $(svn st | awk '/^?/ { print $2 }')
Теперь этот второй вариант будет работать, только если ваш список файлов не превышает максимальную командуразмер строки, поэтому я рекомендую версию xargs.
Или, возможно, даже лучше, снова используйте awk
.
svn st | awk '/^?/ { system("rm -f $2") }'
Это будет функциональный эквивалент того, что вы сделали выше сfor
петля.Это гротескно неэффективно, поскольку он выполняет rm один раз для каждого файла, но, по крайней мере, более читабельно, чем ваш пример цикла for
.Однако его можно улучшить еще дальше.Я не буду вдаваться в подробности здесь, но вместо этого я дам вам комментарии в качестве подсказки относительно того, как будет выглядеть окончательное решение.
svn st | awk 'BEGIN{ /*set up an array*/ }; /^?/ { /*add $2 to the array*/ }; END{ /*system("rm -f ...") safe chunks of the array*/}
ОК, так что последнее будет немного глотком ислишком много, чтобы печатать как обычный однострочный текст.Однако, поскольку вам приходится «часто» делать это, не так уж и плохо поместить это в скрипт:
#!/usr/bin/env awk
BEGIN {
/* set up your accumulator array */
}
/^?/ {
/* add $2 to the array */
}
END {
/* invoke system("rm -f") on safe chunks of the accumulator array */
}
Теперь ваша командная строка будет svn st | myawkscript
.
Теперь я предупрежу вас, что у меня нет возможности проверить все это (поскольку я избегаю SVN и CVS, как я избегаю MS-DOS - и по той же причине).Например, вам может понадобиться использовать строку #!
в сценарии или регулярное выражение, которое вы используете для фильтрации, но общий принцип остается примерно таким же.А мне лично?Я бы использовал svn st | awk '/^?/ { print $2 }' | xargs rm -f
для чего-то, что я делаю редко.Я делаю полный сценарий только для того, что я делаю несколько раз в неделю или больше.