2009-05-06 35 views
2

嘗試重命名Linux服務器上的一系列文件。尋找我想要的文件很簡單:重命名一系列文件

find . -type f -wholename \*.mbox 

當然,作爲MBOX文件,其中一些已在名稱空間,所以就變成:

find . -type f -wholename \*.mbox -print0 

我管路以xargs的使我可以重命名文件:

find . -type f -wholename \*.mbox -print0 | xargs -0 -I{} echo ${"{}"/.mbox/} 

回聲應該返回類似INBOX,給予INBOX.mbox,然而,bash的抱怨:

bash: ${"{}"/.mbox/}: bad substitution 

我該如何解決這個問題?如果可能的話,我想盡量保留在find/xargs解決方案中,這樣我就不會在它周圍添加大量的循環結構。

回答

8

嘗試

find . -type f -wholename \*.mbox | sed 's/\(.*\)\.mbox/mv "\1.mbox" "\1"/' | sh 

這不是100%傻瓜證明應的一些文件包含雙引號字符,但我承擔你可以忽略:)

+0

此解決方案的另一個優點是,如果您離開`| sh`在最後你會得到一個將被執行的命令列表。如果一切看起來都很好,那麼可以將它傳遞到shell來執行。 – 2009-05-06 19:28:37

+0

是的,好點。我總是先花點時間看看這些命令以這種方式運行命令是否合理。 – hlovdal 2009-05-06 19:56:21

1

你可以試試:

find . -type f -wholename \*.mbox -print0 | sed 's/\.mbox//' 

你的問題是在試圖管到xargs的。到那點"{}"並不意味着什麼。

要重命名的文件(假設你是在bash)

find . -type f -wholename \*.mbox -print0 | \ 
    while read I ; do 
     mv $I $(echo $I | sed 's/\.mbox//') ; 
    done ; 
+0

這將如何幫助我重命名文件,但? – 2009-05-06 17:03:24

+0

編輯迴應以滿足您的需求 – dsm 2009-05-07 09:31:32

1

我覺得你需要這個:

find . -wholename \*.mbox | awk '{new=$0; gsub("\.mbox$", "", new) ; system("mv \"" $0 "\" \"" new "\"") }' 

(應該是gawk和mawk兼容,在mawk上測試)。它不使用xargs,但請注意,它不會爲每個移動的文件分配一個新進程。如果您需要移動大量的文件,您會注意到優勢。 Warrning:如果任何文件的名稱中會包含換行符,則會遇到麻煩(但如果這是個問題,上帝與您同在)。

您可以通過使用xargs在單個調用中刪除多個文件來進一步增強此解決方案。

如果你真的需要速度,我建議你使用python腳本而不是awk。這將完成所有rm的沒有一個單一的叉子。

1

你可以使用重命名(1)?它帶有perl。

0

在這裏你去,這應該做的伎倆....

# find . 
. 
./test.tst 
./test1.tst 
./test2.tst 
./test/test4.tst 
./test/test5.tst 

# 

for file in `find . -type f` 
do 
mv $file ${file%.tst}.new 
done 

# find . 
. 
./test 
./test/test4.new 
./test/test5.new 
./test1.new 
./test2.new 
2

GNU並行http://www.gnu.org/software/parallel/有刪除擴展{}:

find . -type f -wholename \*.mbox -print0 | parallel -0 mv {} {.} 

如果你知道文件名不包含\ n然後這將工作:

find . -type f -wholename \*.mbox | parallel mv {} {.}