2008-11-14 23 views
4

作爲Linux中的新手,我有以下問題。 我有文件列表(這次是由svn狀態產生的),我想創建一個腳本來循環它們,並用4個空格替換標籤。如何在svn狀態下循環Linux中的文件

所以我想從

.... 
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; 

但我不知道該怎麼做......

回答

16

你可以使用這個命令:

svn st | cut -c8- | xargs ls 

這將削減前8個字符,只留下一個文件名列表,沒有顛覆標誌。您還可以在cut之前添加grep以僅過濾某些類型的更改,如/^M/xargs會將文件列表作爲參數傳遞給給定的命令(在這種情況下爲ls)。

+0

也謝謝你的回答,我會把它和丹的結合起來。 – eddy147 2008-11-14 10:11:07

3

我會用sed,就像這樣:

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

那大塊的有四個空間。 ;-)

我沒有測試過這一點,但它應該工作。我會備份你的文件以防萬一。 -i標誌表示它將在原地進行文件替換,但如果它弄亂了,你會希望能夠恢復它們。

這假設$文件包含文件名。但是,您也可以使用Adam的方法來獲取文件名,只需使用上面的sed命令,而不使用「$ i」。

+0

感謝您的回答。但是如何在循環中填寫? – eddy147 2008-11-14 10:01:52

+0

請看Adam的回答。基本上將兩者結合起來。他的答案會給你一個可以使用的文件名列表,然後推送我的sed命令而不是最後的「ls」。 – 2008-11-14 10:02:48

2

我不能真正顛覆輸出測試,但是,這個應該做的工作:

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替換每個文件中具有四個空格的選項卡。

3

不要求任何選票,但備案我會後從@Adam Byrtek@Dan Fego合併答案:

svn st | cut -c8- | xargs sed -i 's/\t/ /' 
0

不太你問什麼,但也許你應該尋找到commit鉤子在顛覆?

您可以創建一個鉤來阻止包含標籤在一行的開始,或包含標籤的所有任何代碼簽入。

在回購目錄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