2015-06-12 79 views
3

我試圖將文件boot-1.5-SNAPSHOT.jar複製到boot-1.5.jar複製並替換文件名字符串中的內容

我試過這個使用sed但我得到一個錯誤。我知道語法不對,我希望有人能爲我完成它。

cp boot-* | sed -e 's:-SNAPSHOT::g' 
cp: missing destination file operand after ‘boot-1.5-SNAPSHOT.jar’ 

的這種想法是該腳本將不知道的版本號,只是罐子將是它試圖複製該文件中的文件夾中。這就是我使用星號的原因。版本號變化很頻繁,所以使用cp file file2將無法​​正常工作。

回答

4

沒有必要爲sed,使用Parameter Expansions

$ file=boot-1.5-SNAPSHOT.jar 
$ echo ${file/-SNAPSHOT/} 
boot-1.5.jar 

$ cp "$file" "${file/-SNAPSHOT/}" 

在這種情況下:

$ {參數/模式/字符串}

模式替換。該模式已擴展爲產生 模式,就像在路徑名擴展中一樣。參數被擴展並且 模式與其值最長的匹配被替換爲字符串。

請注意,由於您正在處理文件,因此您應該引用變量(否則帶有空白字符的文件會使事情變得糟糕)。

此外,它是可能的,你應該創造而不是複製一個符號鏈接:

$ ln -s "$file" "${file/-SNAPSHOT/}" 
+0

是的,但請強調引用更多的重要性。原始文件名可能有空白;此外,體育可能引入新的空白 - 要麼是文字分割。所以PE中的引用比簡單的擴展引用更重要。 – kojiro

+0

謝謝Micha。這工作完美。乾杯! – user0000001

2

不能通過管道cp命令sed這樣。您必須首先使用sed文件名,然後進行復制。

f=$(echo boot-*SNAPSHOT.jar) 
cp "$f" $(sed 's:-SNAPSHOT::' <<< "$f") 
相關問題