2009-04-12 87 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