tcsh:如何更改多个文件的文件扩展名?

时间:2009-04-12 14:19:22

标签: regex linux shell tcsh

tcsh中是否有一行命令可以更改一组文件的扩展名?在各种DOS shell中,我曾经使用过以下内容:

ren *.abc *.def

这会将以.abc结尾的所有文件重命名为.def而不是sed。在sed -e 's/\(.\)*\.abc$/\1.def/' 术语中,这将执行如下操作:

tcsh

关于文件名。我可能会把零碎的东西放在一起以实现* nix中类似的东西,但我猜这里的问题是我缺乏{{1}}的经验。

任何帮助表示感谢。

6 个答案:

答案 0 :(得分:7)

输入这四行。在第一个提示之后,tcsh会告诉你你在foreach循环中。您也可以将其转换为shell脚本并调用该shell脚本。

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

答案 1 :(得分:4)

除了其他人所说的,许多UNIX风格提供了一个名为“rename”的命令。如果您的目标是使用tcsh重命名文件,那么这对您无济于事。否则,您可以通过以下方式实现目标:

rename abc def *.abc

这是一个非常简单且非常有用的命令。在第三个参数提供的文件列表中,它将第一个参数的所有匹配项替换为第二个参数。至少在我熟悉的版本中,根本没有模式匹配,除了你的shell将扩展第三个参数的文件列表中的模式的程度。

答案 2 :(得分: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' *

答案 3 :(得分:1)

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

答案 4 :(得分:0)

在* nix世界中,没有“扩展”的概念。 'dot abc'只是文件名的一部分。有一个perl脚本可以模仿行为here

对不起,我不能提供tcsh,但有一个bash成语:

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

答案 5 :(得分:-1)

[整理答案 - 提问者从答复中得到的]:

没有简单的方法可以在tcsh中更改一组文件的名称。查斯。提供了tcsh中最简单的解决方案,但仍然不容易。

如果你使用tcsh作为你的shell使用外部重命名命令,那么做我正在做的事情的最佳方法(参见Eddie的回答)。

我很欣赏这不是我在问题中实际提出的问题 - 但我所学到的是我的问题是错的!

感谢所有回复的人,你的回答非常有帮助 - 每个回答都略有不同。如果有人想以比我更好的方式总结这个问题的结果,请做。我更愿意将我的“接受的答案”给别人!