2013-06-26 110 views
1

我的團隊使用CVS進行版本控制。我需要開發一個shell腳本,它從文件中提取內容並對所有.txt文件執行CVS標記(也包含文本文件當前目錄的子目錄)。從中提取內容的文件和腳本都存在於同一個目錄中。CVS在shell腳本中遞歸標記

我試圖運行腳本:

#!bin/bash 
return_content(){ 
    content=$(cat file1) 
    echo $content 
} 
find . -name "*.txt" -type f -print0|grep - v CVS|xargs -0 cvs tag $content 

文件1 =>從其中內容被提取的文件 「ABC」=>內容內的file1

輸出:

abc 
find: paths must precede expression 
Usage: find [path...] [expression] 
cvs tag: in directory 
cvs [tag aborted]: there is no version here; run 'cvs checkout' first 

我無法弄清楚這個問題。請幫忙

+1

你爲什麼不用標籤標記**修訂版中的所有**文件?這是否正在CVS工作目錄中執行? –

+0

是它的ina Cvs目錄..要求是這樣的,它應該只標記txt文件 – user2475677

回答

2

腳本有幾個問題。

1)shebang行缺少root /。 你有#!bin/bash,它應該是#!/bin/bash

2)-v選項的grep有之間的空間 - 和V(和它不應該)

3)其實你不叫return_content函數在最後一行 - 你指的是函數內的一個變量。也許最後一行應該是這樣的:

find . -name "*.txt" -type f -print0|grep -v CVS|\ 
    xargs -0 cvs tag $(return_content) 

4)即使修復所有之後,你可能會發現grep的抱怨,因爲print0是通過它的二進制數據(有嵌入的空值由於-print0)而grep正在等待文本。您可以使用多個參數find命令來執行grep命令的功能,減少用grep出來,像這樣:

find . -type d -name CVS -prune -o -type f -name "*.txt" -print0 |\ 
    xargs -0 cvs tag $(return_content) 

發現將通過所有條目遞歸在當前目錄(及以下),丟棄任何東西這是一個名爲CVS或以下的目錄,其餘的將只選擇名爲* .txt的文件。

我測試了我的版本,該行與:

find . -type d -name CVS -prune -o -type f -name "*.txt" -print0 |\ 
xargs -t -0 echo ls -la 

我創建了幾個文件的名稱中帶有空格和.txt擴展目錄中的腳本,將顯示結果:

[email protected]:~/junk/find$ find . -type d -name CVS -prune -o \ 
-type f -name "*.txt" -print0 | xargs -t -0 ls -la 
ls -la ./one two.txt ./three four.txt 
-rw-r--r-- 1 bjb bjb 0 Jun 27 00:44 ./one two.txt 
-rw-r--r-- 1 bjb bjb 0 Jun 27 00:45 ./three four.txt 
[email protected]:~/junk/find$ 

-t參數使得xargs顯示它即將運行的命令。我使用ls -la而不是cvs tag - 它應該類似於CVS。

+0

是的這個工程!我最後一次犯了錯誤!謝謝你的詳細回覆 – user2475677