2012-08-29 67 views
31

我想從我的所有文件名在當前目錄刪除一堆文件

for filename in *.fasta;do 

     echo $filename | sed \e 's/test.extra//g' 

    done 

刪除test.extra的文件名中的一部分,但它抱怨不成立file.echo是要確保它正確列出。

+0

請提供您正在處理的文件名滿的一些例子。 – unwind

+0

你想在全球範圍內刪除'test.extra'嗎?我的意思是替換所有匹配,而不僅僅是第一個? – hostmaster

回答

33

首先使用的,而不是 '\ E'

'的sed -e' 的,我會建議你做在bash這樣

for filename in *.fasta; do 
    [ -f "$filename" ] || continue 
    mv "$filename" "${filename//test.extra/}" 

done 
+1

我的文件名有空格。修改上面的內容並使用下面的行爲我工作''mv「$ filename」「$ {filename // test.extra /}」' – Ramesh

+1

Ramesh你是對的。引用參數擴展是常規和良好的做法,尤其是如果它們包含文件名 – hostmaster

0

首先,您有\e而不是-e

18

嘗試rename命令:

rename 's/test.extra//g' *.fasta 
+0

什麼'rename'命令是這樣的?我找不到支持sed-like替換語法的程序。 – unwind

+0

這個重命名的版本實際上是perl包的一部分。 – hostmaster

+2

@unwind正確。我經常使用它,所以我忘了它不是本地人。抱歉! –

26

嘗試rename "extra.test" "" *

$ find 
./extra.test-eggs.txt 
./extra.testbar 
./fooextra.test 
./ham-extra.test-blah 

$ rename "extra.test" "" * 
$ find 
./-eggs.txt 
./bar 
./foo 
./ham--blah 
2
$ mmv '*test.extra*.fasta' '#1#2.fasta' 

這是安全的,因爲mmv根本不會做任何事情,否則它會覆蓋現有文件(有命令行選項可以關閉此功能)。

14

我知道這胎面老了,但是下面oneliner,從驗證答案的啓發,對我幫助很大;)

for filename in ./*; do mv "./$filename" "./$(echo $filename | sed -e 's/test.extra//g')"; done 
+0

是的,它是正確的,但想一分鐘那裏有一個目錄(不是文件)。 – hostmaster