【问题标题】:files with extra suffix in batch批量带有额外后缀的文件
【发布时间】:2016-11-14 18:49:11
【问题描述】:

我正在尝试列出所有在扩展名后有额外后缀的文件 例如:.txt.1 或 .txt.2 等。

我正在使用 txt.,但它给出了所有文件名,而不仅仅是带有额外后缀的文件

for %%A in (*txt.*) do (call :renum "%%A")

在此之后,我正在编写程序以相应地重命名文件。 有人可以检查并帮助。

【问题讨论】:

  • 模式应为*.txt.*(注意添加的点)...
  • @aschipfl:你试过这样做会发生什么吗?
  • 已经试过了,但是没用
  • @zb226,不,我没有,但很明显*txt.* 匹配类似file.txtxtxt.1*.txt.* 不匹配;除此之外,没有更多区别,两者都会匹配file.txt.1.2(无意中)...
  • 如果您知道精确的字符限制,那么您也许可以使用 ?而不是 *,这可能会有所帮助。但是,您可能仍需要在 for 循环中运行额外的 if 检查,例如 zb226 的答案。

标签: batch-file batch-rename


【解决方案1】:

一种解决方案是在循环内按扩展过滤:

FOR %%A IN (*txt.*) DO (
    IF NOT "%%~xA"==".txt" CALL :renum "%%A"
)

这通过使用“FOR 变量引用的增强替换”来工作,在本例中为%%~xA。您可以通过执行FOR /? 来获得所有可用替换的概览。

更新:

  • 此解决方案不区分大小写,因为既没有明确要求也没有禁止。如果需要不区分大小写,请使用 IF /I 而不是普通的 IF
  • 正如dbenham 所说,有一些极端情况:
    • name.txt.txt 不会被处理。如果没问题没有明确说明,但很有可能。
    • name_txt.ext 处理,这是由于给定的通配符 *txt.* 而可以通过使用 *.txt.* 来避免。我最初不更改它的理由是只有 OP 知道他的实际文件集,我认为他有选择它的理由(这种情况在这类问题中很常见)。

【讨论】:

  • 如果文件名为“name.txt.txt”,这将不起作用
  • 这也会不正确地处理像“name_txt.ext”这样的名字
  • @dbenham:你说得对——我对这些问题发表了评论。
【解决方案2】:

您可以像这样使用两个嵌套的for 循环:

rem // Corrected file pattern (added a `.`):
for %%A in ("*.txt.*") do (
    rem // Check (last) file extension:
    if /I not "%%~xA"==".txt" (
        rem // Remove (last) file extension:
        for %%B in ("%%~nA") do (
            rem // Check next-to-last file ext.:
            if /I "%%~xB"==".txt" (
                call :renum "%%~A"
            )
        )
    )
)

根据for(在命令提示符窗口中键入for /?)的帮助,for 变量的~x 修饰符检索文件扩展名(这是最后一个点. 以及之后的所有内容)。 ~n 修饰符检索除文件扩展名之外的所有内容,因此检索文件(基本)名称。上面的代码使用两个嵌套的for 循环来获取最后一个和倒数第二个文件扩展名,并根据.txt 检查它们(以不区分大小写的方式)。

请注意,call 命令行不会对以 .txt.txt 结尾的文件执行。

【讨论】:

  • +1,但我不明白您为什么包含第一个过滤掉“name.txt.txt”等名称的 IF 语句。我想在某些情况下可能需要这样做,但我可能想重命名这样的名称。
  • @dbenham,因为 OP 的示例中额外的后缀是数字,例如 .1.2、... 我假设如果最后一个扩展名是 .txt,它已经很好了。 ..
【解决方案3】:

我会将 FINDSTR 与 DIR /B 和 FOR /F 一起使用

以下将处理带有任意数量的额外扩展名的名称,例如 name.txt.extname.txt.ext.ext 等。这包括像 name.txt.txt 这样的名称

for /f "delims= eol=:" %%F in (
  'dir /b /a-d *.txt.*^|findstr /i "\.txt\."'
) do call :renum "%%F"

此变体将仅处理具有单个额外扩展名的名称,例如 name.txt.ext(包括 name.txt.txt

for /f "delims= eol=:" %%F in (
  'dir /b /a-d *.txt.*^|findstr /i "\.txt\.[^.]*$"'
) do call :renum "%%F"

您也可以查看我的JREN.BAT regular expression file renaming utility。它可能可以一步过滤和重命名您的所有文件,而无需任何自定义批处理脚本。

例如,以下只会重命名看起来像“name.txt.ext”的文件,并将它们转换为“name_ext.txt”

jren "(\.txt)\.([^.]+)$" "_$2$1" /i

【讨论】:

  • 文件名中有txt怎么办?
  • @Bharath - 搜索字符串中的前导点文字会阻止在基本名称中匹配 txt。从技术上讲,.txt 如果不在末尾,则将被视为基本名称的一部分,但我们假设这是预期的扩展名。
  • @Bharath - 如果您想包含像 XXXXtxt.ext 这样的名称,不带前导点。然后只需使用'dir /b /a-d *txt.*^|findstr /i "txt\."'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 2012-09-01
相关资源
最近更新 更多