1

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

ren *.abc *.def

这会将所有.abc以结尾的文件重命名为.def. 就sed其而言,这将执行如下操作:

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

在文件名上。我可能会拼凑一些零碎的东西来在 *nix 中实现类似的东西,但我猜这里的问题是我缺乏使用tcsh.

任何帮助表示赞赏。

4

6 回答 6

7

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

foreach n ( `ls *.abc` )
set base = `basename $n .abc`
mv $n $base.def
end
于 2009-04-12T14:30:11.957 回答
4

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

rename abc def *.abc

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

于 2009-04-12T16:27:25.873 回答
3

我不知道是否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' *
于 2009-04-12T14:24:42.690 回答
2
foreach f (*.abc)
mv $f $f:r.xyz
end
于 2018-03-01T15:20:10.790 回答
-1

在 *nix 世界中没有“扩展”的概念。“点 abc”只是文件名的一部分。有一个 perl 脚本来模仿这里的行为。

很抱歉我不能提供 tcsh,但是有一个 bash 成语:

for f in *.foo; do
    mv $f ${f%foo}bar
done
于 2009-04-12T14:34:15.847 回答
-2

[整理答案 - 提问者从回复中得到了什么]:

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

如果您使用 tcsh 作为您的外壳程序,那么执行我所追求的最佳方法是使用外部重命名命令(请参阅 Eddie 的回答)。

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

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

于 2009-04-16T05:28:01.977 回答