2015-02-11 28 views
1

我有幾個目錄,我想重新命名: 等: 「交貨期年的」目錄「交貨期」(只刪除 - 年) 「啓動年」目錄「開始」在bash目錄重命名使用的sed

這是我已經試過:

for CACHE in `find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year" ` ; 
do 
set UPDATE="awk -F"-year" '{print $1}' $CACHE" ; 
mv $CACHE $UPDATE 
done 

但是它不會成功。有沒有使用「sed」命令重命名目錄?

+1

您需要使用反引號s或'$(...)'運行一個命令並將輸出分配給一個變量。相反,您使用雙引號中的'awk'命令。 – Barmar 2015-02-11 20:55:59

回答

0

是的,你可以使用管道。我這樣做:

for DIR in $(find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year"); do 
    mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')   
done 

應當指出的是,我非常自我學習,有時有壞習慣......

諮詢gniourf_gniourf我張貼一個更強大的版本(read more)之後,這是一個下面是Ed Morton的答案的「代碼提升」。

find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*-year"| 
while IFS= read -r DIR 
do 
    mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')   
done 
+0

真棒。它工作! – user2519184 2015-02-11 21:14:57

+0

喬布斯顯然自動修正了「reggae」到「reggae」,但它是一個有趣的自動更正,所以我會離開它。 – 2015-02-11 21:16:47

+2

這裏有很多壞習慣的確如此:'對於$(find ...)'的DIR是非常糟糕的:當文件名包含空格或水平字符時它會中斷;您也需要引用所有變量,出於同樣的原因。有趣的是,你正在使用圍繞變量名稱的高度無用的curlies,但拒絕使用強制性引用。去搞清楚。 – 2015-02-11 22:28:25

2

您錯誤地指定了awk的結果。它應該在反引號內或$(...)。並且爲了處理一個變量,你需要管道echo $CACHE給它,而不是使用$CACHE作爲文件名參數(這將處理文件的內容)。所以該行應該是:

而變量未使用set分配,您只需編寫var=value

所以該行應該是:

UPDATE=$(echo "$CACHE" | awk -F-year '{print $1}`) 

但有沒有必要使用awk爲此不惜一切,你可以使用shell變量擴展運營商:

UPDATE=${CACHE%%-year*} 

%%year*表示去除最長尾部的值與通配符-year*匹配。

0

或者使用rename命令

rename 's/-year//' *year 
1

很多殼的解決方案將「工作」,對於給定的樣本輸入設置,然後炸燬慘敗後,通常是由於未加引號的變量,空白的不正確處理,等,除非你的文件名中包含換行符(在這種情況下看到find -print0xargs -0)這應該是安全的:

find "$DESTINATION_REPO" -maxdepth 1 -type d -name "*-year" | 
while IFS= read -r CACHE 
do 
    mv -- "$CACHE" "${CACHE%-year}" 
done 
+1

這個包含換行符的文件名(這是不太可能的,我知道,但它仍然是可能的)。有兩種方法可以解決這個問題:使用'print0'和'read'使用空字節分隔符或'find'$ DESTINATION_REPO「-maxdepth 1 -type d -name」* -year「-exec bash -c'for CACHE;做mv - 「$ CACHE」「$ {CACHE/-year}」;完成'_ {} +' – 2015-02-11 22:23:29

+0

好點,我添加了一個關於這一點的筆記。 – 2015-02-11 22:33:02