【问题标题】:Batch to rename files and remove the date in filename批量重命名文件并删除文件名中的日期
【发布时间】:2018-06-29 07:40:27
【问题描述】:

我有多个目录和子目录,需要删除所有文件名的日期部分并保留文件名的其余部分。

例如

输入:Dummy-Filename-V0001-01202018.txt

输出:虚拟文件名-V0001.txt

基本上,我需要删除“-01202018”部分。

注意事项:

  1. 它还应该涵盖其他文件格式,例如“.pdf”“.csv”等(不确定所有可用的文件类型)
  2. 日期可以采用不同的格式,例如 DDMMYYYY、MMDDYYYY、YYYYMMDD 或其他组合。
  3. 到目前为止,我只在文件名的末尾看到了日期。
  4. 我在 /Sample/00AA/0001/01202018/file.txt 下有最多 /5000/ 的文件,还有 /Sample/00BB/ 和子文件夹。

我目前有下面的代码,我已经能够遍历所有子目录并显示带有日期的文件,但是我尝试的重命名命令不起作用。 (见 cmets)

FOR /R "C:\Users\Dummy\Desktop\UAT\Sample\" %%G in (.) DO (
Pushd %%G
Echo now in %%G
echo before
dir
dir "*-01202018*"

REM ren *-01202018.txt *.txt
REM ren ???-01202018.txt ???.txt
REM rename 's/-01202018//' *
REM rename "*-01202018*" "*/////////*"

echo after
dir
Popd )
Echo "back home"

PAUSE

【问题讨论】:

  • 我质疑您的动机,并想知道当日期戳被删除后,其中有多少名称将不再是唯一的?
  • 所有文件都是唯一的,同一个文件可能出现在目录的不同日期文件夹中。哦,对不起,目录有日期文件夹。 /Sample/00AA/0001/01202018/file.txt
  • 这些目录中的每个文件是否都具有相同的 -Date 后缀,或者其中一些没有日期?其中是否有多个连字符或多个句点?
  • 有些没有日期,有些有日期,日期格式不同,如上所示。没有日期的不需要触摸。
  • 是的,连字符、句号和下划线(我没有注意到任何其他特殊字符)可能会或可能不会出现在文件名上。

标签: batch-file design-patterns rename


【解决方案1】:

根据我们上面的讨论,我试图尽可能地推广这个解决方案:

@setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@set prompt=$G

@if "%1" equ "" goto :UsageError PrefixPattern
@if "%2" equ "" goto :UsageError Literal
@if "%3" equ "" goto :UsageError PostfixPattern

@for %%A in (%1%2%3) do @call :TruncateFileName "%%A" "%2"
@exit /b 0

:TruncateFileName
@set _name=%~1
@set _name=!_name:%~2=!
@echo Renaming %~1 =^> %_name%
@ren %1 "%_name%"
@exit /b 0

:UsageError
@echo Missing parameter: %1
@exit /b 160

请务必在一个或多个实际目标目录的副本中对此进行测试。您可以一次单独测试一个目录,但我会编写一个脚本来迭代您的目录并在此处调用此脚本 (lots of examples can be found here at SO)。

用法:RenameThem.cmd <prefixPattern> <literal> <postfixPattern>

示例:RenameThem.cmd * -20180109 *.pdf

【讨论】:

  • 抱歉耽搁了,我今晚请客吃饭。上面的脚本花了大约 20 分钟来编写和测试。它只有一堆排列,所以我建议您在一个或多个数据文件的副本上对其进行测试。您还可以将它用作脚本的模板,该脚本将转储它将更改的文件的名称,以及将它们更改为什么,只需将@ren 命令替换为@echo 命令即可。祝你好运!
  • 谢谢!我之前遇到的主要问题似乎在通配符上,因为我需要文件名的更具体部分。我最终将文件名的部分放在脚本上,以便进行重命名之前和之后。抱歉,我等不及了,因为这是一个生产问题,需要立即解决。我将尝试此代码并测试它是否更具动态性,如果他们仍然需要它,则更新 prod 中的代码。谢谢!
猜你喜欢
  • 2023-04-03
  • 2019-06-25
  • 1970-01-01
  • 2014-11-13
  • 2013-12-19
  • 2017-04-20
  • 1970-01-01
  • 2019-10-18
相关资源
最近更新 更多