Vista命令行中的递归文件复制和重命名

3
我正在尝试递归遍历我的音乐目录,并将名为folder.jpg的每个文件复制到同一目录中名为cover.jpg的文件中。
我尝试了这个问题中的建议的变体,例如:
for /r %i in (folder.jpg) do copy %i cover.jpg

导致“系统找不到指定的文件”的原因是什么?如何解决这个问题? 编辑 以下是我最终选择的方案:
for /r %i in (folder.jpg) do copy "%i" "%~picover.jpg"
5个回答

5

试试这个:

for /f "usebackq delims==" %I in (`dir /b /s ^| findstr folder.jpg`) do copy "%I" "%~pIcover.jpg"

解码器环:

usebackq :: 在反引号中运行命令,并将输出用作循环的输入
delims== :: 使用等号作为分隔符。实际上,您可以使用任何文件名中无效的字符。
dir /b /s :: 执行递归目录列表,仅输出裸文件名
^| :: ^ 转义管道字符,管道将第一个命令的输出传输到第二个命令
findstr :: 搜索匹配行的输入,并仅输出它们
%~pI :: 波浪线 p 指示变量扩展仅输出路径而不是完整文件名+路径。请注意,这包括尾随 \

希望这能帮助您!


那是相当强大的命令行操作。它完美地完成了任务,谢谢。此外,解码器环节也很棒,特别是关于%~pI的部分。我发现以下命令也可以运行:for /r %i in (folder.jpg) do copy "%i" "%~picover.jpg" - Kenny

1

PowerShell必须取代CMD。这是不可避免和正义的。而我的工作就是帮助它实现...

gci -r . folder.jpg | % { copy $_.FullName ([IO.Path]::Combine( $_.Directory.FullName, "cover.jpg" )) }

SO对PowerShell代码块的格式化效果不是很好,因为其语法与C语言不太相似。因此,我通常使用<PRE>标签来处理PowerShell代码块。但在这种情况下,它会将两个下划线识别为斜体,即使在<PRE>标签中也是如此。因此,我做出了妥协并将其改为代码块。 - Jay Bazuzi

1

你的音乐文件夹里可能没有名为 folder.jpg 的文件,所以它失败了,对吧?

我在我的音乐文件夹中尝试了一下,使用一个名为 folder.jpg 的虚拟文件,然后它正常复制了。;)

编辑:

Kishi 是对的,你在第二个 %i 上缺少双引号。


其实你在某个阶段是对的 :P 我之前递归地将所有的folder.jpg文件重命名为cover.jpg。 - Kenny

1

您在复制命令中缺少双引号。

%i变量将保存文件的完整路径,其中可能包含空格。请尝试使用:

for /r %i in (folder.jpg) do copy "%i" cover.jpg

是的,实际上我确实错过了引号,谢谢。下一个问题是它总是复制到我运行命令的目录中,例如e:\Music。 - Kenny

0

你可以使用xcopy命令并加上/s标志...

编辑: 我的错 - 没有仔细阅读问题。当只需将文件复制到固定目的地时,使用带有/s选项的xcopy命令会很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接