![使用 RENAME 为一组文件添加前缀时出现的问题](https://linux22.com/image/1611501/%E4%BD%BF%E7%94%A8%20RENAME%20%E4%B8%BA%E4%B8%80%E7%BB%84%E6%96%87%E4%BB%B6%E6%B7%BB%E5%8A%A0%E5%89%8D%E7%BC%80%E6%97%B6%E5%87%BA%E7%8E%B0%E7%9A%84%E9%97%AE%E9%A2%98.png)
我在尝试重命名文件夹中的几百张图像时遇到了以下问题(这是既定的,我无法影响它)。
所有文件都具有结构“名称{空格}后缀.JPG“。
因此图像可以具有相同的姓名,但在这种情况下,其区别在于后缀.例如
L083192 (1).JPG
L083192 (2).JPG
L083192 (3).JPG
L083192 (4).JPG
或者
L081473 a.JPG
L081473 b.JPG
目的是为所有同名图像添加一个计数器(作为前缀)。即
1_L083192 (1).JPG
1_L083192 (2).JPG
1_L083192 (3).JPG
1_L083192 (4).JPG
[..]
16_L081473 a.JPG
16_L081473 b.JPG
计数器是在“FOR /F”循环中计算的,该循环确定哪些名称相同,因此应该获得相同的前缀。
但是当我尝试通过应用以下 REN 命令添加计数器前缀时:
ren "%%h*" "!cnt!_%%h*"
我遇到麻烦了。
(%%h and !cnt! are variables of the "FOR /F" loop
)
这是相应的输出:
L083192 (1).jpg >> 1_L0831921).jpg [i.e. " (" gone missing]
[..]
L083192 (4).jpg >> 1_L0831924).jpg [id.]
两个“L081473”文件甚至导致单身的输出文件(不带后缀)!
16_L081473.JPG
毫无疑问,这与 dbenham 在他的关于 REN(AME) 命令的详尽文章,但我无法解决上述情况,因为我预计原始文件名会被截断,而不是在此过程中丢失一些中间字符。也许原始文件名中的空格是原因,尽管我在命令中引用了这些文件名REN
以容纳空格?有人能解释一下吗?
此外,由于REN
似乎无法产生所寻找的结果(或者可以吗?),我如何使用普通批处理获得目标结果?
REN
我也尝试使用COPY
或来解决这个问题XCOPY
,但结果是一样的。这些命令似乎采用了相同的方案——正如 dbenham 精心建议的那样在同一篇文章中(见注释)。
批处理文件
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
ren "%%h*" "!cnt!_%%h*"
cd..
[some more logic..]
set prev=%%h
)
笔记:我删除了批处理中的附加逻辑,这样可以避免文件被多次重命名。“input.txt”仅包含所有出现的名称(即没有后缀),这足以计算前缀。我可以提供一个示例文件,但没有找到如何将其链接到此消息。此外,这不允许复制重命名(此外,“Images”文件夹大约为 480 Mb)。
通过更改为子目录“Images”(其中的文件正在等待重命名)来考虑此文件夹中的完整文件名。(REN
仅在当前目录中有效)
答案1
您错过了,或者没有意识到我的 RENAME 帖子中此段的重要性:
任何名称都可以分解为由
.
字符分隔的部分,并且只能在每个部分末尾添加或删除字符。不能在组件的开头或中间删除或添加字符,同时使用通配符保留其余部分. 任何地方都允许替换。
您正在尝试在基本名称的开头添加字符,并使用通配符保留基本名称。根据我上面的陈述,这无法完成。您必须单独重命名每个文件。这应该不是特别困难。我假设您的其他逻辑是正确的:
FOR /F %%h IN (input.txt) DO (
IF NOT "%%h" == "prev" (set /A cnt+=1)
[some more logic..]
cd Images
for %%F in ("%%h*") do ren "%%F" "!cnt!_%%F"
cd..
[some more logic..]
set prev=%%h
)
%%F
请注意,如果由于启用了延迟扩展而包含,代码将失败!
。这可以通过增加一些代码来解决。最好先禁用延迟扩展,然后根据需要暂时启用。
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
endlocal
for %%F in ("%%h*") do ren "%%F" "%%N_%%F"
)