【问题标题】:Rename multiple files in shell [duplicate]在shell中重命名多个文件[重复]
【发布时间】:2011-10-18 04:27:23
【问题描述】:

我在一个目录中有多个文件,例如:linux_file1.mp4linux_file2.mp4 等等。如何使用 shell 移动这些文件,以便名称为 file1.mp4file2.mp4 等。我有大约 30 个文件要移动到新名称。

【问题讨论】:

标签: bash shell


【解决方案1】:
$ rename 's/linux_//' linux_*.mp4

【讨论】:

    【解决方案2】:

    我喜欢mmv这种东西

    mmv 'linux_*' '#1'
    

    但您也可以使用rename。请注意,通常有两个 rename 命令具有非常不同的语法。一个是用Perl写的,一个是用util-linux发行的,所以下面我把它们区分为“perl rename”和“util rename”。

    使用 Perl 重命名:

    rename 's/^linux_//' linux_*.mp4
    

    正如 cweiske 正确指出的那样。

    使用 util 重命名:

    rename linux_ '' linux_*.mp4
    

    你怎么知道你有哪个重命名?尝试运行rename -V;如果您的版本是 util rename ,它将打印版本号,如果是 perl rename ,它将无害地报告和未知选项并显示使用情况。

    如果您没有 renamemmv 并且不想或无法安装它们,您仍然可以使用普通的旧 shell 代码完成此操作:

    for file in linux_*.mp4 ; do mv "$file" "${file#linux_}" ; done
    

    这种语法适用于任何符合 XPG4 或更高版本的 POSIX sh,这些天基本上都是 shell。

    【讨论】:

    • 提供的链接是404。
    • 你能解释一下这个语法吗:${file#linux_},我也有类似的情况,只是我想把*_32.png改成*_24.png
    • @catalyst294:Shell 变量可以用$foo${foo} 扩展(它们是等价的),这称为参数扩展,但带有花括号的版本允许修改值扩展时间,这称为parameter substitutionbash 实现包括标准不需要的替换。请记住始终全引用您的变量扩展,否则会遭受意外结果!
    • mmv一般提供什么包?
    • @AlexejMagura:Debian 在一个名为 mmv 的包中提供了它。我无法评论其他发行版。
    【解决方案3】:

    使用目录遍历的简单原生方式:

    find -type f | xargs -I {} mv {} {}.txt
    

    将重命名每个文件,并在末尾添加扩展名 .txt。

    并行化还有一个更通用的酷方法:

    find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:10}trump${f:4}'
    

    【讨论】:

      【解决方案4】:

      我能够通过结合@dtrckd 和@Sorpigal 的答案来替换目录中的文件名。

      for file in `find -name "linux_*.mp4"`; do mv "$file" "${file/linux_/}" ; done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-14
        • 2019-08-27
        • 1970-01-01
        • 2012-05-01
        • 2013-05-02
        • 1970-01-01
        • 2013-04-03
        • 2021-11-30
        相关资源
        最近更新 更多