2013-02-13 66 views
0

我只是盲目地遵循教程中的命令來一次重命名多個文件夾。任何人都可以解釋作爲sed的-e選項的參數給出的「p; s」的含義。「sed」用法的說明

[[email protected] delsure]# ls 
ar1 ar2 ar3 ar4 ar5 ar6 ar7 
[[email protected] delsure]# find . -type d -name "ar*"|sed -e "p;s/ar/AR/g"|xargs -n2 mv 
[[email protected] delsure]# ls 
AR1 AR2 AR3 AR4 AR5 AR6 AR7 
+0

無論您在哪裏找到該命令,都可以從書籤中刪除該教程。這不是移動目錄的方式。該sed是完全沒有必要的。 – 2013-02-13 13:20:52

+0

嗨@EdMorton,如果你不介意,你可以發佈一個鏈接或提供其他簡單的方法嗎? – Arun 2013-02-13 14:03:24

+0

我剛剛發佈了一個答案,所以你可以看到一種方法來做到這一點。也可以使用'find -exec'或'xargs',但我不傾向於使用,因爲我的文件名不包含換行符,並且循環簡潔且可擴展。 – 2013-02-13 22:25:03

回答

1

sed腳本(遵循-e選項位)可以包含多個命令,通過;

該腳本在您的示例分離使用p命令打印模式空間(即,線只是從輸入讀)後跟s命令在模式空間上執行替換。

默認情況下(除非模式空間被清除或者sed給出-n選項)在處理每行之後,將再次打印當前模式空間行,以便打印替換結果。

另一種方式來寫同樣的事情將是:

sed -e "p" -e "s/ar/AR/g" 

此命令分​​成兩個腳本。另一種方法是:

sed "p;s/ar/AR/g" 

,因爲如果到sed的唯一參數是一個腳本,則不需要

-e選項在bash
+0

嗨朋友(@ sudo_O,@ jpm), 感謝您的回覆,所有的答案都幫助我理解了sed的用法。 – Arun 2013-02-13 12:19:11

1

-e選項的參數是一個由兩個命令組成的腳本。第一個是p,它打印未摻雜的輸入,第二個是標準的全局替換。因此,對於輸入ar1,這應該輸出

ar1 
AR1 

這一招的另一部分是xargs的的-N2選項,它迫使每次只使用兩個參數(而不是儘可能多的,因爲它可以處理的,這會產生非常不同的結果)。

0

方式一:

$ ls 
ar6 ar7 

$ find . -name 'ar*' | while IFS= read -r file; do echo mv "$file" "${file^^}"; done 
mv ./ar6 ./AR6 
mv ./ar7 ./AR7 

擺脫「回聲「,當你對輸出滿意時。