【问题标题】:Batch renaming files on Windows Command Line在 Windows 命令行上批量重命名文件
【发布时间】:2019-01-25 15:44:16
【问题描述】:
我有几个由构建脚本生成的文件,如下所示:
sfml-audio-s-d.lib
sfml-graphics-s-d.lib
sfml-system-s-d.lib
...
我需要重命名它们以删除 -s-d 部分(在某些情况下可能只是 -s)。在 SO 周围搜索了一个小时后,我认为使用 rename 命令会很简单:
Ren ".\sfml-*-*.lib" "sfml-*.lib"
悬停它不会更改目录中的任何文件。
重命名这些文件的正确方法(最好是单行)是什么?
【问题讨论】:
标签:
batch-file
command-line
window
rename
command-prompt
【解决方案1】:
以下是您在使用命令时遇到的一些问题。首先,您似乎正在尝试仅使用 -s 重命名文件。问题是Ren "sfml-*-*.lib" "" 不能假定文件路径中的通配符。这意味着REN 不知道在"sfml-*.lib" 中为* 放置什么。
要解决这个问题,您需要解决* 是什么。为此,可以使用FOR 语句。 FOR 语句首先需要的是文件名。使用命令For /f %%A In ('dir /b *.lib') Do (Echo %%A) 将列出所有文件名。现在的问题是我们只需要audio 中的sfml-audio-s.lib。
要使用FOR 语句仅抓取某些对象,您可以添加/f "tokens=2" %%A。这将告诉语句只抓取短语中的第二个单词。这种情况下的问题是,这仅在sfml-audio-s.lib 与sfml audio s.lib 隔开时才有效。通过添加delims=-,该语句将忽略解析中的所有-。更多关于here的信息。
来自 CMD: (一定要 CD 到目录位置)
从 *.lib 文件名中删除“-s”
For /f "tokens=2 delims=-" %A In ('dir /b *.lib') Do (Ren "sfml-*-*.lib" "sfml-%A.lib" 2>NUL)
从 *.lib 文件名中删除“-s-d”
For /f "tokens=2 delims=-" %A In ('dir /b *.lib') Do (Ren "sfml-*-*-*.lib" "sfml-%A.lib" 2>NUL)
来自 BATCH: (将 CD C:\folder location 添加到脚本中)
从 *.lib 文件名中删除“-s”
For /f "tokens=2 delims=-" %%A In ('dir /b *.lib') Do (Ren "sfml-*-*.lib" "sfml-%%A.lib" 2>NUL)
从 *.lib 文件名中删除“-s-d”
For /f "tokens=2 delims=-" %%A In ('dir /b *.lib') Do (Ren "sfml-*-*-*.lib" "sfml-%%A.lib" 2>NUL)