【问题标题】:Batch add basename to another file将基本名称批量添加到另一个文件
【发布时间】:2021-01-15 02:24:31
【问题描述】:

我搞砸了 mmv 并从文件夹中的文件名末尾删除了几个字符(在扩展名之前)。

幸运的是,我还有其他具有相同原始基本名称但扩展名不同的文件。 我想知道是否有办法制作循环:

  • 将修改后的文件中剩余的基本名称与具有原始文件名的第二个文件相匹配。
  • 如果匹配,请使用原始文件名重命名文件

例子:

Wrong filenames: foo-1234.txt 
                 foo-1225.txt
Right files:    foo-1234-5678.png
                foo-1225-6789.png

期望的输出:

foo-1234-5678.txt
foo-1225-6789.txt

非常感谢您!

【问题讨论】:

    标签: command-line rename filenames batch-rename


    【解决方案1】:

    你没有提到我们在谈论什么环境,但我假设它是 Windows cmd。你可以试试这个:

      @echo off
      setlocal enabledelayedexpansion
      for %%f in (foo-*.png) do set f=%%f & rename !f:~0,8!.txt !f:~0,13!.txt
    

    它必须从批处理文件中执行 - 延迟扩展在直接命令行中不起作用。

    编辑

    powershell 对应:

    dir foo-*.png | % { $stem = $_.name -replace 'foo-([^.]+).png','$1'; $bad = $stem.substring(0,4); mv foo-$bad.txt foo-$stem.txt; }
    

    重击:

    for file in foo-*.png; do stem=${file:4:9}; bad=${file:4:4}; mv foo-${bad}.txt foo-${stem}.txt; done
    

    【讨论】:

    • 是的,对不起,我在 bash。你能解释一下do stem=${file:4:9}; bad=${file:4:4} 是什么意思吗?我不确定我是否理解它的作用,所以我可以随意修改它。谢谢!
    • Expression ${file:4:9} 从变量文件中给出 9 个字符,从第五个开始(它从 0 开始)。有关详细信息,请参阅gnu.org/software/bash/manual/html_node/…
    • 其实在这种情况下,这样就不会那么混乱了:for file in foo-*.png; do mv ${file:0:8}.txt ${file:0:13}.txt; done
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多