2010-08-05 69 views
3

當我們在本地開發時,我們將「.dev」或「.prod」附加到只應分別供開發/生產服務器使用的文件中。從shell中的文件中遞歸移除文件名後綴

我想要做的是;在將站點部署到服務器後,遞歸查找所有帶有「.dev」後綴的文件(例如)並將其刪除(重命名文件)。我該如何去做這件事,最好完全在shell中(沒有腳本),所以我可以將它添加到我們的部署腳本中?

我們的服務器運行Ubuntu 10.04。

+0

這已經回答了:http://stackoverflow.com/questions/2171966/bash-rename-extension-recursive – alfredodeza 2010-08-05 13:01:25

+0

@alfredodeza:感謝您指出了一個出來 - 我找不到任何那裏(而不是shell腳本),這些都是我想要的。但是,下面有一些很好的答案。 – Tom 2010-08-05 13:12:30

回答

3

試試這個(不完全殼而已,需要findmv公用事業):

find . '(' -name '*.dev' -o -name '*.prod' ')' -type f -execdir sh -c 'mv -- "$0" "${0%.*}"' '{}' ';' 

如果你有renamexargs工具,您可以加速這個了很多:

find . '(' -name '*.dev' -o -name '*.prod' ')' -type f -print0 | xargs -0 rename 's/\.(dev|prod)$//' 

兩個版本都可以使用任何文件名,包括包含換行符的文件名。

+0

+1,這比我的好。但是,如果你有嚴格的兼容性需求,你可能想知道POSIX'find'沒有'-execdir'或'-print0',我相信''$ {0%.dev}「'是一個bashism。 – bcat 2010-08-05 13:12:19

+0

這似乎工作得很好;我用's/\。dev $ //'取代了'/ \。dev $ /。prod /',因爲我希望完全刪除擴展名。沒有特別的兼容性需求,所以對重命名/ xargs的依賴不成問題。謝謝! – Tom 2010-08-05 13:16:00

+0

'sh'的聯機手冊表示'sh'知道後綴移除。 '-execdir'可以替換爲'-exec'(Linux手冊中說它不太安全),但是'-print0'不可能被替換。 – Philipp 2010-08-05 13:21:08

1
for file in `ls *.dev`; do echo "Old Name $file"; new_name=`echo $file | sed -e 's/dev//'` ; echo "New Name $new_name"; mv $file $new_name; done 

在一些我最近使用這個代碼查找與new.xml在文件名更改日期結束的所有文件的示例(文件名是形式xmlEventLog_2010-03-23T11的:16:16_PFM_1_1.xml ),從名稱中刪除_new和重命名文件名以新的名稱:

for file in `ls *new.xml`; do echo "Old Name $file"; new_name=`echo $file | sed -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/2010-03-23/g' | sed 's/_new//g'` ; echo "New Name $new_name"; mv $file $new_name; done 

這是你想要的東西的類型?

+0

這不會遞歸到子目錄中。 – bcat 2010-08-05 12:59:46

+0

它不適用於包含任何「特殊」(空格,換行符,非打印字符等)的文件名。 – Philipp 2010-08-05 13:02:38

+0

只是想幫忙。不會再在這個網站上做這件事 – amadain 2010-08-05 13:07:06

0

這是完全未經測試,但這應該在你選擇的POSIX的shell工作:

remove-suffix() { 
    local filename 
    while read filename; do 
     mv "$filename" "$(printf %s "$filename" | sed "s/\\.$1\$//")" 
    done 
} 

find -name '*.dev' | remove-suffix .dev 

注:在一個或多個您的文件名中包含一個換行符,this won't work非常不尋常的情況。

0
find /fullpath -type f -name "*.dev"|sed 's|\(.*\)\(\.pdf\)|mv & \1.sometag|' | sh