我有一个大型网站的镜像,需要重新组织,大多数图像和文件我都能够以编程方式移动并重新链接;但是,有一些(少数是相对而言,我们说的是 3,000 个奇怪的文件)我需要在混乱的文件夹中找到。
我知道文件名(我有很长的列表,并且我假设它们是唯一的,或者至少足够唯一,以便我可以手动修复任何冲突)但不知道它们在文件结构中的位置,我需要将它们复制到单独的目录,以便我可以上传它们。
简而言之,我有一个列表,例如
file1.jpg
file2.doc
file4.ppt
filesomethingelse.this
在一个文件中(比如说filelist.txt
)。
我有一个像这样的文件夹结构
folder\subfolder\file1.jpg
folder\subfolder\file2.doc
folder\subfolder2\filesomethingelse.this
folder\file3.jpg
folder\file4.ppt
我想要得到
secondFolder\file1.jpg
secondFolder\file2.doc
secondFolder\file4.ppt
secondFolder\filesomethingelse.this
请注意,file3.jpg
不应复制,因为它不在列表中。
我猜想像(xcopy 或 robocopy)这样的命令行是最好的选择,这样我就可以批量处理请求。
希望这是有意义的。
答案1
如果您只想复制名称在 中列出的文件filelist.txt
,并跳过未列出的文件(例如,file3.jpg
在您的示例中),请执行
for /r folder %f in (*) do @findstr/i /x "%~nxf" filelist.txt > nul && copy %f secondfolder
%f
被分配了 下每个文件的完整路径名folder
;%~nxf
提取名称和扩展名(即基本文件名;最后一个 之后的所有内容\
)。@
禁止显示以下命令。这是表面的和可自由选择的。此外,如果您将此命令放在批处理文件中并以 开头,则没有必要@echo off
。findstr
在文件(或其他数据集)中查找字符串(或模式);它本质上是 Windows 的等价物grep
。我们使用它来确定每个文件名是否在文件名列表中,filelist.txt
。/i
— 不区分大小写匹配。如果你确定列表的大小写正确,可以省略此项。/x
— 匹配整行(如grep -x
)。这可以防止文件名le2.do
与 匹配file2.doc
。
> nul
— 相当于> /dev/null
;这会阻止显示输出findstr
。(当然,这只是为了避免屏幕混乱,是可选的。)&&
—copy
如果前一个命令 ( )findstr
成功执行,则执行下一个命令 ( )。(findstr
如果找到匹配项,则成功;即,如果文件名在列表中。)- 如果您的文件名中包含奇怪的字符,您可能需要将最后一个字符
%f
放入引号 ("%f"
) 中,并可能更改findstr
命令。 - 在真正运行此命令之前,您可能需要更改
copy
为echo copy
,以便进行试运行并查看该命令将执行什么操作。 - 如果将命令放入批处理文件中,请将所有出现的 更改
%
为%%
。 - 如果你想获取文件所在位置的列表(日志),你可以这样做
for /r folder %f in (*) do @findstr/i /x "%~nxf" filelist.txt > nul && (echo %f & copy %f secondfolder)
答案2
我认为这:
for /R c:\source %f in (*) do copy "%f" x:\destination\
应该可以帮你完成这个工作。