2013-05-25 91 views
0

我有一個用於更改mht文件的文件名的腳本,但它不遍歷dirs和子dirs。我問在本地論壇上的問題,我得到的回答是,這是一個解決方案:Bash腳本遞歸地更改文件名

find . -type f -name "*.mhtml" -o -type f -name "*.mht" | xargs -I item sh -c '{ echo item; echo item | sed "s/[:?|]//g"; }' | xargs -n2 mv 

但它產生一個錯誤。通過我的一些實驗,事實證明sh -c會將文件名與空格分開,並且會產生錯誤。我怎樣才能解決這個問題?

#!/bin/bash 
# renames.sh 
# basic file renamer 
for i in . *.mht 
do 
j=`echo $i | sed 's/|/ /g' | sed 's/:/ /g' | sed 's/?//g' | sed 's/"//g'` 
    mv "$i" "$j" 
    done 
+0

如果你試過這個:'find。 -type f \(-name「* .mhtml」-o -name「* .mht」\)| xargs -I item sh -c'{echo \「item \」; echo \「item \」| sed「s/[:? |] // g」; }'| xargs -n2 mv' – lurker

+0

它生成類似的錯誤 – user2420889

回答

2
#! /bin/bash 
find . -type f \(-name "*.mhtml" -o -name ".mht" \) -print0 | 
while IFS= read -r -d '' source; do 
    target="${source//[:?|]/}" 
    [ "X$source" != "X$target" ] && 
    mv -nv "$source" "$target" 
done 

更新:根據原來的問題做了重新命名,並增加了對.mht支持。

+0

它也不處理.mht文件 – lurker

+0

它沒有任何錯誤沒有文件名更改。 – user2420889

1

使用rename。隨着重命名,你可以指定一個重命名模式:

find . -type f \(-name "*.mhtml" -o -name "*.mht" \) -print0 | xargs -0 -I'{}' rename 's/[:?|]//g' "{}" 

這樣你可以正確處理名稱與空格。 xargs將用find命令提供的每個文件名替換{}。還要注意使用-print0和-0。這使用\ 0作爲分隔符,以避免處理包含\ n(換行符)的filname的問題。

-o沒有按照預期的方式工作。您必須使用括號來分組條件。

如果您處理以「.mHtml」結尾的文件,您也可以考慮使用-iname而不是-name。

+0

Lynch只有你的解決方案是corect謝謝 – user2420889

+0

@user祕密是在發佈之前測試!你知道如果它解決了你的問題,你可以接受我的答案。接受答案有助於社區,否則人們會在您的問題上花費時間,意識到已經有了一個有效的解決方案。 – Lynch