将文件从目录树中的某处复制到文件夹

将文件从目录树中的某处复制到文件夹

我有一个大型网站的镜像,需要重新组织,大多数图像和文件我都能够以编程方式移动并重新链接;但是,有一些(少数是相对而言,我们说的是 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命令。
  • 在真正运行此命令之前,您可能需要更改copyecho 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\

应该可以帮你完成这个工作。

相关内容