首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅将文件从第一级子文件夹复制到另一个位置

仅将文件从第一级子文件夹复制到另一个位置
EN

Stack Overflow用户
提问于 2015-08-20 22:28:47
回答 2查看 2.2K关注 0票数 1

我希望将所有文件仅复制到第二级子文件夹中的其他位置。所有文件名都是唯一的。本例中的第二级子文件夹为01102009、05302009和09012010。示例:

代码语言:javascript
复制
C:\test\
  2009\
    01102009\
       file123.A09
       file567.B07
    05302009\
       fileabc.A09
       filexyz.A09
       ThirdLevelSubFolder\
          fileBLAH.B10
  2010\
     09012010\
        fileHello.A08
        fileBye.B10
  etc.

应返回:

代码语言:javascript
复制
C:\final\
   file123.A09
   file567.B07
   fileabc.A09
   filexyz.A09
   fileHello.A08
   fileBye.B10

注意,它没有复制位于第三级子文件夹中的fileBLAH.B10。

如果有帮助,所有文件都以.A##或.B##结尾,其中##是一个两位数字。

我试过这个:

代码语言:javascript
复制
robocopy "C:\test" "C:\final" s /LEV:2 

但是它会复制到第二级文件夹(例如,01102009)和它们中的文件。我只想要那些文件。

我也试过:

代码语言:javascript
复制
for /r "C:\test" %i in (*.*) do copy "%~fi" "C:\final" 

但是,这会在所有的子文件夹中复制文件,包括第三级的,而我只想在第二级的子文件夹中复制文件。

EN

回答 2

Stack Overflow用户

发布于 2015-08-21 01:04:23

根据foxidrive的注释最终编辑。您需要两个嵌套循环来处理第二级子文件夹中的文件(尽管aschipfl的解决方案使用可能会更简洁一些):

代码语言:javascript
复制
for /F "delims=" %I in ('dir /B /A:D "C:\test\*.*"') do @for /F "delims=" %i in ('dir /B /A:D "C:\test\%~I\*.*"') do @echo copy /B "C:\test\%~I\%~i\*.*" "C:\final\*.*" 2>NUL

原始答案

for /r = 循环遍历文件(递归子文件夹);在FOR /F = 循环命令:针对另一个命令的结果中尝试(而不是递归) dir /B,如下所示:

代码语言:javascript
复制
for /F "delims=" %i in ('dir /B /A:D "C:\test\*.*"') do copy /B "C:\test\%~i\*.*" "C:\final\*.*" 2>NUL

注意,如果源文件夹为空,2>NUL将禁止显示The system cannot find the file specified消息。

Output (将C:\更改为D:\):第一个dir /B显示我们以目标文件夹为空开始,而最后一个dir /B显示目标被复制的文件填充.

代码语言:javascript
复制
d:\bat>dir /B "d:\final\*.*"

d:\bat>for /F "delims=" %i in ('dir /B /A:D "d:\test\*.*"') do @copy /B /Y "d:\test\%~i\*.*" "d:\final\*.*" 2>NUL
d:\test\31441809\ttt.txt
        1 file(s) copied.
d:\test\ProcMon\LogfileAcrord32Start.CSV
d:\test\ProcMon\LogfileIE.CSV
d:\test\ProcMon\LogfileIEStart.CSV
d:\test\ProcMon\LogfileSwriter.CSV
d:\test\ProcMon\LogfileSwriterStart.CSV
        5 file(s) copied.
d:\test\ScreenCaptures\*.*
        0 file(s) copied.
d:\test\set\HKCU.txt
d:\test\set\hklm.txt
d:\test\set\regs.txt
d:\test\set\set.txt
d:\test\set\t!exclam!t.txt
        5 file(s) copied.

d:\bat>dir /B "d:\final\*.*"
HKCU.txt
hklm.txt
LogfileAcrord32Start.CSV
LogfileIE.CSV
LogfileIEStart.CSV
LogfileSwriter.CSV
LogfileSwriterStart.CSV
regs.txt
set.txt
t!exclam!t.txt
ttt.txt

d:\bat>
票数 1
EN

Stack Overflow用户

发布于 2015-08-21 01:39:15

诀窍是两个嵌套的for /D循环,每个循环覆盖特定的目录层次结构级别:

代码语言:javascript
复制
@echo off
for /D %%A in ("C:\test\*") do (
  for /D %%B in ("%%~fA\*") do (
    xcopy /L /I "%%~fB\*.*" "C:\final"
  )
)

这段代码实际上没有复制任何内容,它只是列出了要复制的内容;要启用复制,请从/L中删除xcopy开关。

脚本不针对模式*.A??*.B??进行筛选;如果要这样做,则需要两个xcopy命令。

此外,它不会从第一个目录级别复制任何内容,因为示例清单中没有显示任何文件。

修正案:

当我谈到目录级别时,我参考了以下定义:

所有层次的编号相对于根位置C:\test\,因此2009\是第一级,01102009\是第二级,依此类推。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32129482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档