【问题标题】:tcsh: How to change the file extension for multiple files?tcsh:如何更改多个文件的文件扩展名?
【发布时间】:2023-04-01 11:57:02
【问题描述】:

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

ren *.abc *.def

这会将所有以.abc 结尾的文件重命名为以.def 结尾。在sed 术语中,这将执行如下操作:

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

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

任何帮助表示赞赏。

【问题讨论】:

    标签: regex linux shell tcsh


    【解决方案1】:

    输入这四行。在第一个提示之后,tcsh 会告诉你你在foreach 循环中。你也可以把它变成一个 shell 脚本并调用那个 shell 脚本。

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

    【讨论】:

    • 不需要中间变量,见brainiac的回答
    【解决方案2】:

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

    rename abc def *.abc
    

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

    【讨论】:

    • 感谢您的回答,但是,我是否可以将 *-r.pk 之类的文件重命名为 *.pk 而无需将 rename 标识为 -r 作为选项?
    【解决方案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' *
    

    【讨论】:

      【解决方案4】:
      foreach f (*.abc)
      mv $f $f:r.xyz
      end
      

      【讨论】:

      • 这是执行此操作的正确 tcsh(不是 bash)习语,我已确认它在 tcsh 中有效
      【解决方案5】:

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

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

      如果你使用 tcsh 作为你的 shell,最好的方法是使用外部重命名命令(参见 Eddie 的回答)。

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

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

      【讨论】:

      • 不正确:如果你有一个变量set foo=foobar.baz,你可以echo $foo:r.ext得到foobar.ext。然后它只是foreach f (*),然后您可以在foreach 循环中引用$f。 (以end 结尾)。请参阅 Brainiac 的答案。
      • :r 是一个“冒号修饰符”,记录在 freebsd 的 tcsh 手册页中,在“历史替换”部分中还有其他类似的修饰符。它获取文件名的“根名称”,从字面上接受它是文件名中第一个句点之前的部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2019-09-23
      • 1970-01-01
      • 2021-10-19
      • 2013-03-27
      • 2016-06-29
      • 1970-01-01
      相关资源
      最近更新 更多