以递归方式将特定源文件类型添加到svn

时间:2011-10-12 19:23:15

标签: regex linux svn bash scripting

我知道这是一个丑陋的剧本,但它完成了这项工作。 我现在面临的是增加一些扩展,这将更加混乱。 如何使其更加模块化? 具体来说,如何在多行上编写这个长正则表达式(源文件扩展名)?说每行一个扩展名。我想我在使用字符串连接时遇到了问题,但不确定究竟是什么。 这是原始文件:

#!/bin/bash
COMMAND='svn status'
XARGS='xargs'
SVN='svn add'
$COMMAND | grep -E '(\.m|\.mat|\.java|\.js|\.php|\.cpp|\.h|\.c|\.py|\.hs|\.pl|\.xml|\.html|\.sh|.\asm|\.s|\.tex|\.bib|.\Makefile|.\jpg|.\gif|.\png|.\css)'$ | awk ' { print$2 } ' | $XARGS $SVN

这里大致是我的目标

...code code
'(.\m|
\.mat|
\.js|
.
.
.
.\css)'
..more code here

任何人

3 个答案:

答案 0 :(得分:1)

#!/bin/bash
COMMAND='svn status'
XARGS='xargs'
SVNADD='svn add'
pats=
pats+=' \.m'
pats+=' \.mat'
pats+=' \.java'
pats+=' \.js'

# add your 'or-able' sub patterns here

# build the full pattern 
pattern='(';for pat in $pats;do pattern+="$pat|";done;pattern=${pattern%\|}')$'

# run grep with the generated pattern
files=$($COMMAND | grep -E ${pattern} | awk ' { print $NF } ')
if [ " $files" != " " ]
then
   $COMMAND | grep -E ${pattern} | awk ' { print $NF } ' | $XARGS $SVNADD
fi

答案 1 :(得分:1)

这个怎么样:

PATTERNS="
\.foo
\.bar
\.baz"

# Put them into one list separated by or ("|").
PATTERNS=`echo $PATTERNS |sed 's/\s\+/|/g'`

$COMMAND | grep -E "($PATTERNS)"

(请注意,如果在调用echo中调用$ PATTERNS周围的引号,这将不起作用 - echo正在处理剥离空格并将换行转换为空格。)

答案 2 :(得分:1)

我知道这并没有直接回答这个问题,但从可读性的角度来看,我认为大多数开发人员会同意单行正则表达式是最常用的做事方式,因此是最易维护的方法。此外,我不确定您为什么要在每个扩展中包含一段时间,这应该只需要使用一次。

我写了这个小脚本来自动将所有图像添加到svn。您应该能够在正则表达式中的管道之间添加扩展,以添加或删除不同的文件类型。请注意,它确保仅通过确保每行以“?”开头来添加无法识别的文件。 (^ \?)并以句点结尾(\。(extensions)$)。希望它有用!

#!/bin/bash

svn st | grep -E "^\?.*\.(png|jpg|jpeg|tiff|bmp|gif)$" > /tmp/svn-auto-add-img

while read output; do
    FILE=$(echo $output | awk '{ print $2 }')
    svn add $FILE
done < /tmp/svn-auto-add-img

exit 0