2012-04-06 59 views
1

數據結構如下,我想將「lane-7」更改爲「lane-5」。 我正在考慮像這樣的命令,但它不起作用。使用bash更改文件名

find PATH -name "lane-7*" | xargs -i echo mv {} `echo {}|sed 's/lane-7/lane-5/'` | sh 

Anyidea?由於

PATH/28/lane-7-22.fq 
PATH/28/lane-7-21.fq 
PATH/28/lane-7-18.fq 
PATH/28/lane-7-24.fq 
PATH/28/lane-7-23.fq 
PATH/28/lane-7-19.fq 
PATH/28/27/lane-7-22.fq 
PATH/28/27/lane-7-21.fq 
PATH/28/27/lane-7-18.fq 
PATH/28/27/lane-7-24.fq 
PATH/28/27/lane-7-23.fq 
PATH/28/27/lane-7-19.fq 
PATH/28/27/26/lane-7-22.fq 
PATH/28/27/26/lane-7-21.fq 
PATH/28/27/26/lane-7-18.fq 
PATH/28/27/26/lane-7-24.fq 
PATH/28/27/26/lane-7-23.fq 
PATH/28/27/26/lane-7-19.fq 
PATH/28/27/26/25/lane-7-22.fq 
PATH/28/27/26/25/lane-7-21.fq 
PATH/28/27/26/25/lane-7-18.fq 
PATH/28/27/26/25/lane-7-24.fq 
PATH/28/27/26/25/lane-7-23.fq 
PATH/28/27/26/25/lane-7-19.fq 
... 
+1

查看'rename'或'prename'命令(而不是'rename()'函數)。如果它存在於您的系統上,請使用它。如果沒有,找到它;它會更簡單。 (問題是在'find'開始之前執行反引號的命令!) – 2012-04-06 16:29:30

+0

它是如何失敗的?如果你刪除尾部的'| sh',你應該看看命令是否正確,或者有什麼問題。 – zigdon 2012-04-06 16:30:51

+1

這裏已經有一些很好的答案。只是一些提示。你不能管殼通信sh。您可以將它們寫入臨時文件並執行。使用find和xargs時,使用find -print0和xargs -0。然後它也可以與包含空格的文件名一起使用。否則你可能會搞砸了很多。 – Cougar 2012-04-06 16:44:53

回答

2

你可以用while環和一個bash字符串替換做到這一點:

find PATH -name "lane-7*" | while read -r file ; do 
    echo mv $file ${file/lane-7/lane-8} 
done 

取出echo如果出現良好。

2

使用rename,它爲此作出:

find PATH -name "lane-7*" | xargs rename "lane-7" "lane-5" 

您可能會遇到rename而不是perl的版本(Debian的默認安裝的話)。在這種情況下,只需使用perl表達式:

find PATH -name "lane-7*" | xargs rename "s/^lane-7/lane-5/" 
+0

很酷,謝謝Martin! – user1269298 2012-04-09 22:21:42