2014-07-07 94 views
1

我試圖用find和sed重命名一些目錄,但切換基於目錄名稱。使用查找和sed替換重命名目錄

例子目錄名:

rabbit_stand_a_e 
rabbit_stand_a_ne 

我希望這些改變爲:

rabbit_a_stand_e 
rabbit_a_stand_ne 

,所以我想基本上是由分裂_和開關$ 2和大約$ 3

我試着幾件事情,但不能得到任何工作,這是我現在在哪裏。

find . -type d -execdir mv {} `echo {} | sed -E 's/rabbit_([a-z]+)_([abc])_/rabbit_\2_\1_/'` \; 

此誤差與

mv: cannot move ‘rabbit_stand_a_e’ to a subdirectory of itself, ‘rabbit_stand_a_e/rabbit_stand_a_e’ 
+1

,並學會這樣調試問題通過選擇1個代表文件名,而不是使用'find',使用'回聲rabbit_stand_a_e | sed -E'/....//'看你的問題在哪裏。在這種情況下,你可以意識到'mv'需要和源以及目標參數。無論如何...祝你好運! – shellter

+0

嗯,我以爲我給了兩個,'mv {} \'echo .....'{}成爲當前的 – Rob

+0

我的sed工作正常,它是獨立的,就像你建議'echo rabbit_stand_a_w | sed -E's/rabbit _([az] +)_([abc])_/rabbit_ \ 2_ \ 1 _ /''所以我必須錯過使用-exec或mv – Rob

回答

1

問題從當find確實取代爲{}參數時,你的殼運行子shell(括在反引號命令的一部分)與莖。

在運行給定命令之前,對所有子殼體進行評估之前的。這意味着您最終會運行您的echo {} | sed ...'命令,然後{}被替換爲一個文件名,這意味着您實際上會回顯字符串"{}"並將其管道輸入sed。由於您的sed模式不匹配"{}",它只是返回{}不變,留給你這一點:

find . -type d -execdir mv {} {} 

現在,當find運行它取代的{}兩次出現給定目錄名稱,因此,您的錯誤信息對嘗試將目錄移入自己。

解決這個問題的最簡單的方法可能是解釋整個命令bash -c,並在參數中傳遞{}來砸:

find . -type d -execdir bash -c 'mv $1 `echo $1 | sed -E "s/rabbit_([a-z]+)_([abc])_/rabbit_\2_\1_/"`' -- {} \; 

我覺得應該有與xargs這樣做一個簡單的方法,但目前我對此並不明顯。如果我稍後想到它,我會更新我的答案(或者如果有其他人想要與意見相吻合的評論)。


相關閱讀:Subshell arguments in -exec parameter for find(1)

+0

感謝您的回答,完美。我能夠通過for循環獲得我需要的行爲 – Rob