2012-04-09 33 views
0

我在我想重命名的目錄結構中有大量文件。反抽不工作

的文件名格式爲:
「AAAAAA-bbbbbb_cccccc-ddddd_eeeee-FFFFF-GGGGG-hhhhh.psd」

我希望他們以這種格式:
「AAAAAA-Bbbbbb_Cccccc-Ddddd_Eeeee-FFFFF -Ggggg-Hhhhh.psd

一個單一的發現和sed慣例應該將其轉化爲正確的格式:

find . -name "*psd" -exec sh -c "echo 'cp '{} `echo {} | sed 's/\([_-][a-z]\)\([A-Z]*\)/\2\U\1/g'`" \; 

但它不工作:

輸入:

輔助 - 或自動/摘要渲染/輔助 - 或auto_abstract-render_tiny-bubbles3.psd

輸出:

CP ./Assisted-or-Auto/ Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd ./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd

sed例程工作,如果我刪除反引號並插入一個分號。

find . -name "*bubbles3.psd" -exec sh -c "echo 'cp '{} ; echo {} | sed 's/\([_-][a-z]\([A-Z]*\)/\2\U\1/g'" \; 

cp ./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd 
./Assisted-Or-Auto/Abstract-Render/assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd 

所以,由於某種原因反向並不是做它應該做的事情。關於如何解決此問題的任何想法? FYI與 「$(CMD)」 代替反引號符號具有相同的效果

由於

回答

0

嘗試

sed 's/\([/_-][a-z]\)\([A-Z]*\)/\2\U\1/g' 

echo $'./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd' \ 
| sed 's/\([/_-][a-z]\)\([A-Z]*\)/\2\U\1/g' 

輸出

./Assisted-Or-Auto/Abstract-Render/Assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd 

我只加了'/'來匹配最初的小寫字母部分(我的sed說mismatched \(.. \),所以我在邏輯上加了1。

我希望這會有所幫助。

2

最有可能的是,shell首先解釋反引號內的命令(甚至在運行find之前)。然而,「{}」在find運行之後,將不會有任何特殊含義,直到。嘗試爲您的命令創建shell函數或bash腳本,而不是將其寫入內聯。這應該讓你做更復雜的事情,而不用擔心shell轉義的問題。

0

輕微變化

$ input=Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd 
$ sed 's!\(/\|-\|_\)[a-z]!\U&!g' <<< "$input" 
Assisted-Or-Auto/Abstract-Render/Assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd 

可以製成一個小吸塵器GNU sed的

$ sed 's!(/|-|_)[a-z]!\U&!g' <<< "$input" 
0

避免反引號,因爲這意味着你問轉義的問題。

正如已經指出的那樣,在調用find之前反引號可能會生效。

使用$(),可以嵌套沒有太多的麻煩逃跑,然後逃避$(command)$,使其生存的調用,並獲得通過,以find。從這一點開始(假設find使用shell - 例如$SHELL)來執行你的命令),事情會正常工作。

0

這可能會爲你工作:

find . -name "*bubbles3.psd" | 
sed 'h;s/\(^\|[/_-]\)./\U&/g;H;g;s/^/cp -v /;s/\n/ /' | 
bash 

如果你想看到執行之前cp命令,只留下了最後管| bash