Board logo

标题: [文件操作] [已解决]批处理将子目录里的文件夹移动到父目录中去 [打印本页]

作者: 001011    时间: 2020-10-4 20:47     标题: [已解决]批处理将子目录里的文件夹移动到父目录中去

一个文件夹下有N级文件夹,需要把最末级的文件夹复制到它的父文件夹
下图是比较规律的文件夹结构
实操时文件夹结构比较复杂  需要首先判断末级文件夹
作者: went    时间: 2020-10-4 21:53

folder是主文件夹,如果主文件夹含中文,代码保存为asni编码,注意备份
  1. @echo off
  2. set "folder=G:\Desktop\test"
  3. for /r "%folder%" /d %%i in (*) do (
  4. dir /b /ad "%%i" | findstr . >nul || (
  5. echo %%i
  6. move "%%i" "%%~dpi\.."
  7. echo -----------------------
  8. )
  9. )
  10. pause&exit
复制代码

作者: Batcher    时间: 2020-10-4 22:00

回复 1# 001011


    遇到同名文件夹的冲突问题需要如何处理呢?
作者: 001011    时间: 2020-10-4 22:05

本帖最后由 001011 于 2020-10-4 23:51 编辑

非常感谢
就是有个问题  比如说A--1--1这样的文件夹结构
由于子文件夹名和父文件夹名相同  造成无法移动
有办法解决吗
作者: 001011    时间: 2020-10-4 22:05

回复 3# Batcher

是啊  我也在纠结这个问题
作者: Batcher    时间: 2020-10-4 22:49

回复 5# 001011


这个不是代码需要解决的问题,而是需要问你自己想现实什么功能。
以你顶楼的截图为例:
A\1\1 不止跟 A\1 冲突,还会跟 A\2\1 冲突。
要么合并、要么覆盖、要么重命名,你得先想清楚需求,然后再讨论代码如何实现。
作者: 001011    时间: 2020-10-4 23:15

回复 6# Batcher
谢谢回复
确实是我考虑不周
实际操作中 只会有这种情况:A\1\1  没有A\2\1的情况
最终A\1中是1会删除掉的(A\1\1中是末级文件夹1已经移动到A下面了,所以父文件夹的1就是个空文件夹,当然也可以在程序运行的时候删掉更好)  所以可以考虑把A\1中的1改名后  再移动文件
作者: newswan    时间: 2020-10-5 16:31

本帖最后由 newswan 于 2020-10-5 16:43 编辑

思路:
1  dir /s /ad 列出所有目录
2  根据目录列表,重命名文件夹

A
A\1
A\1\1
A\1\2
作者: qixiaobin0715    时间: 2020-10-5 16:52

根据2楼代码修改,需移动的文件夹重命名为“上一级文件夹名-移动前文件夹名”
  1. @echo off
  2. for /r /d %%a in (*) do (
  3.     dir /b /ad "%%a" | findstr . >nul || (
  4.         for %%i in ("%%a\..") do move "%%a" "%%~dpa\..\%%~nxi-%%~na"
  5.     )
  6. )
  7. pause&exit
复制代码

作者: 001011    时间: 2020-10-5 18:12

本帖最后由 001011 于 2020-10-5 18:16 编辑

回复 9# qixiaobin0715


    感谢回复
但是把需要移动的文件夹加前缀好麻烦  还得把前缀去掉
可以命名父文件夹吗  因为移动后父文件夹就没有用了

还有一个简单办法 不用重命名  只需要
出一个文档  告诉一下那个文件夹下的那个文件夹和那个文件夹名字重复  也可以
作者: Batcher    时间: 2020-10-5 23:05

回复 8# newswan


    能否把代码发出来看下你是如何解决文件夹同名问题的?
作者: newswan    时间: 2020-10-5 23:55

本帖最后由 newswan 于 2020-10-7 12:53 编辑

回复 11# Batcher


我的意思是,先导出目录列表,检查重名
另外,我还有一个问题,移动目录的规则,不能是把最低一级的目录向上移动一次,而应该是某目录之下,某一级子目录的子目录向上一级。
这样可能更可靠一些,比如,处理过程中出错,一部分经过处理,一部分没有。
作者: newswan    时间: 2020-10-6 01:23

本帖最后由 newswan 于 2020-10-6 01:34 编辑

列出目录,
第一列是移动后的路径,第二列是移动前的路径
  1. set _fld_=test
  2. for /f %%a in ('dir /b /ad %_fld_%') do (
  3. >>list.txt echo %%a
  4. for /f %%b in ('dir /b /ad %_fld_%\%%a') do (
  5. >>list.txt echo %%b \%%a\%%b
  6. if not exist %_fld_%\%%b (
  7. copy nul %_fld_%\%%b
  8. ) else (
  9. copy nul %_fld_%\%%a-%%b
  10. )
  11. )
  12. rmdir %%a
  13. )
复制代码
或者用占位文件模拟一次
作者: qixiaobin0715    时间: 2020-10-6 08:07

本帖最后由 qixiaobin0715 于 2020-10-6 09:07 编辑

回复 10# 001011

如果只是最后一级文件夹及上一级文件夹重名的话,代码已获得最后一级文件夹及上一级文件夹,还不是想移就移,想改就改,想删就删,只是不知你具体的文件结构。最后一级文件夹及上一级文件夹重名可用if判断一下,根据你自己的实际需求修改代码。
还有一个办法就是分步走:
1.运行上面代码移动文件夹
2.删除空文件夹,论坛里有的
3.还原改名的文件夹,用类似str=!str:*-=!的结构
不就是运行三个批处理吗,也不是太麻烦。这样还不容易出错。

如果像你在一楼所列移动文件夹,A\1和A\2,B\1和B\2不但存在上下级重名,还存在同级重名的话,就必须更改需移动的文件夹名了。
作者: qixiaobin0715    时间: 2020-10-9 14:28

抱歉,楼上帖子中有点想当然。实测循环过程中更改中间级文件夹的名称不可行(for循环开始时已将所有路径规划好),改名后路径变化,会出现提示“系统找不到指定的文件”。还是分步处理的好。
作者: 001011    时间: 2020-10-12 22:25

感谢大家,刚刚上班比较忙没有及时感谢各位老师 抱歉了
关于这个问题的解决办法,线下有个朋友帮忙解决了
方法是:首先剪切出所有文件夹,剪切出来以后把这文件夹加一个统一的后缀,如:1_new,在全部剪切出来后删除空文件夹,这样也就把原先的父文件夹删除掉了  再统一去掉后缀  然后就OK了
请原谅不能把代码贴出来  因为朋友写的是类似exe的程序 我看不到代码
再次感谢
作者: qixiaobin0715    时间: 2020-10-13 10:11

回复 16# 001011
由于批处理运行时是按顺序一行行执行的,上面所说的三步可以写在一个批处理里面。
  1. @echo off
  2. for /r /d %%a in (*) do (
  3.     dir /b /ad "%%a" | findstr . >nul || (
  4.         for %%i in ("%%a\..") do move "%%a" "%%~dpa\..\%%~nxi_%%~na" >nul
  5.     )
  6. )
  7. for /f "delims=" %%m in ('dir /ad /b /s^|sort /r') do rd "%%m" 2>nul
  8. setlocal enabledelayedexpansion
  9. for /r /d %%n in (*) do (
  10.     dir /b /ad "%%n" | findstr . >nul || (
  11.         set var=%%n
  12.         set var=!var:*_=!
  13.         ren "%%n" "!var!"
  14.     )
  15. )
  16. pause&exit
复制代码

作者: 唏嘘的南巴仔    时间: 2022-2-9 11:11

回复 2# went




for /r "%folder%" /d %%i in (*) do (  

请教一下   
    "%folder%" /d  
    这个/d 有什么作用?可以把这个/d 移动到 /r  后面吗?
作者: Batcher    时间: 2022-2-9 11:57

回复 18# 唏嘘的南巴仔


参考for命令教程第10页:
http://bbs.bathome.net/thread-31727-1-1.html




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2