如何批量更改子文件夹中的文件扩展名[重复]

Posted

技术标签:

【中文标题】如何批量更改子文件夹中的文件扩展名[重复]【英文标题】:How to Batch change file extensions within subfolders [duplicate] 【发布时间】:2013-02-25 09:26:48 【问题描述】:

我对命令提示符很陌生,从 1 天前才开始使用它。

我在某个位置有一个文件夹,例如C:\Users\Administrator\Desktop\Images,在该文件夹内大约有 650 个子文件夹,每个子文件夹包含大约 20 张图像,混合了 JPG 和 PNG。我正在寻找 CMD 的命令行,它将遍历所有子文件夹并将每个 .png 文件更改为 .jpg 文件。

我做了一些研究,发现了一些信息,但是很难理解和理解,我仍然无法做到。我想保留文件名,但是将每个文件扩展名从 .png 更改为 .jpg

我知道对于 1 个文件夹,该行类似于 ren *.png *.jpg。但是,这不会将更改应用到子文件夹。

【问题讨论】:

我认为这个问题属于SuperUser而不是***。 Stack Overflow 专门用于解决编程问题。 @Jesse:关于批处理或其他 shell 编程,或者类似的 bash 编程,有很多关于 SO 的问题。为什么这个特别不适合这里? @Jesse:的确,这是关于脚本的,而不仅仅是使用现成的工具。脚本也是编程,尤其是当它需要控制结构时,比如循环。 【参考方案1】:

如果我理解正确,您只想将文件从 .png 重命名为 .jpg,而不是转换它们,您可以使用以下批处理代码:

@ECHO OFF
PUSHD .
FOR /R %%d IN (.) DO (
    cd "%%d"
    IF EXIST *.png (
       REN *.png *.jpg
    )
)
POPD

更新:我找到了一个更好的解决方案 here,您可以直接从命令行运行(如果在批处理文件中使用,请使用 %%f 而不是 %f):

FOR /R %f IN (*.png) DO REN "%f" *.jpg

请注意,上面将处理当前目录及其子目录。如有必要,您可以指定任意目录作为根目录,如下所示:

FOR /R "D:\path\to\PNGs" %f IN (*.png) DO REN "%f" *.jpg

【讨论】:

pushd .?有什么意义(如果你原谅双关语)? :) @AndriyM: 有趣的双关语:-) 我想确保命令提示符在完成所有子目录后返回到原始目录,而不是在最后一个目录中结束cd-ed进入。有没有更好的方法来实现这一点? 一种替代方式,是的。会不会更好,我不确定。我想到的是在循环之前将%CD% 存储在一个变量中,然后在之后对其进行CD-ing。我猜也有两个命令,但太平庸了。 :) 你的解释对我来说很有意义,谢谢。 尽管您可能只是放弃更改目录。我认为ren "%%d\*.png" *.jpg 应该可以正常工作。 (您也可以省略if existren ... 2>nul 会隐藏有关不存在文件的警告。) @AndriyM:很好的建议,谢谢,这确实是一个改进。我在 SO 上找到了一个更好的选择 - 请参阅更新的答案。

以上是关于如何批量更改子文件夹中的文件扩展名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何更改某些文件模式/扩展名的权限?

怎么批量删除一个文件夹里的所有指定扩展名的文件?

matlab如何批量更改文件名(删除每个文件名中的一段相同的字符串)

如何用bat更改文件扩展名

批量文件替换没有扩展名的字母

Win7如何批量删除.svn文件