2009-04-12 155 views
1

tcsh中是否有單行命令來更改一組文件的擴展名?在各種DOS彈,我曾經使用下列內容:tcsh:如何更改多個文件的文件擴展名?

ren *.abc *.def 

這將重命名.abc結尾來結束,而不是.def所有文件。在sed條款這將執行類似以下內容:

sed -e 's/\(.\)*\.abc$/\1.def/' 

上的文件名。我可能會把它們拼湊起來,在* nix中實現類似的效果,但我猜這裏的問題是我缺少tcsh的經驗。

任何幫助表示讚賞。

回答

0

[整理答案 - 什麼提問者從響應了]:

有沒有簡單的方法來改變一組文件的名稱tcsh中。查斯。提供了tcsh中最簡單的解決方案,但它仍然不容易。

如果您使用tcsh作爲您的shell使用外部重命名命令(請參閱Eddie的回答),那麼執行後續操作的最佳方法是。

我明白,這不是我在問題中實際詢問的 - 但我學到的是我的問題是錯的!

感謝大家的回覆,你的回答非常有幫助 - 每個人都有不同的方式。如果有人想以比我更好的方式總結這個問題的結果,請做。我更願意把我的「接受的答案」給別人!

2

我不知道,如果tcsh提供了一個更簡單的方法來做到這一點,但這裏是我最常做的:

ls *.abc | sed 's/\(.*\)\.abc/mv "\1.abc" "\1.def"/' | sh 

我也寫稱爲regexmv一個Python腳本使用正則表達式重命名文件。這裏的腳本:

import os 
import re 
import sys 
import os.path 

def main(argv): 
    dry_run = True 
    if argv[0] == '-f': 
     dry_run = False 
     argv = argv[1:] 

    pattern = argv[0] 
    repl = argv[1] 
    files = argv[2:] 

    max_length = max([len(f) for f in files]) 

    for f in files: 
     new = re.sub(pattern, repl, f) 
     if f != new: 
      if not os.path.exists(new): 
       print "%s --> %s" % (f.ljust(max_length), new) 
       if not dry_run: 
        os.rename(f, new) 

if __name__ == '__main__': 
    main(sys.argv[1:]) 

我第一次運行它,就像這樣:

regexmv '\.abc$' '.def' * 

看看哪些文件會被改名(以及它們將如何被重新命名),如果這就是我想要的,我運行它:

regexmv -f '\.abc$' '.def' * 
7

鍵入這四行。第一次提示後,tcsh會告訴你,你在foreach循環內。你也可以把它變成一個shell腳本並調用這個shell腳本。

foreach n (`ls *.abc`) 
set base = `basename $n .abc` 
mv $n $base.def 
end 
0

* nix世界中沒有「擴展」的概念。 '點abc'只是文件名的一部分。有一個perl腳本來模仿here的行爲。

我很抱歉,我不能提供tcsh的,但有一個bash成語:

for f in *.foo; do 
    mv $f ${f%foo}bar 
done 
3

除了其他人所說,許多UNIX系統提供了一個名爲「rename」命令。如果您的目標是使用tcsh重命名文件,具體來說,那麼這不會對您有所幫助。否則,您可以通過以下方式實現您的目標:

rename abc def *.abc 

這是一個非常簡單且非常有用的命令。在由第三個參數提供的文件列表中,它將第一個參數的所有出現替換爲第二個參數。至少在我熟悉的版本中,根本沒有模式匹配,除非你的shell會擴展第三個參數文件列表中的模式。

0
foreach f (*.abc) 
mv $f $f:r.xyz 
end