标题: [文件操作] [已解决]批处理将子目录里的文件夹移动到父目录中去 [打印本页]
作者: 001011 时间: 2020-10-4 20:47 标题: [已解决]批处理将子目录里的文件夹移动到父目录中去
一个文件夹下有N级文件夹,需要把最末级的文件夹复制到它的父文件夹
下图是比较规律的文件夹结构
实操时文件夹结构比较复杂 需要首先判断末级文件夹
作者: went 时间: 2020-10-4 21:53
folder是主文件夹,如果主文件夹含中文,代码保存为asni编码,注意备份- @echo off
- set "folder=G:\Desktop\test"
- for /r "%folder%" /d %%i in (*) do (
- dir /b /ad "%%i" | findstr . >nul || (
- echo %%i
- move "%%i" "%%~dpi\.."
- echo -----------------------
- )
- )
- 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楼代码修改,需移动的文件夹重命名为“上一级文件夹名-移动前文件夹名”- @echo off
- for /r /d %%a in (*) do (
- dir /b /ad "%%a" | findstr . >nul || (
- for %%i in ("%%a\..") do move "%%a" "%%~dpa\..\%%~nxi-%%~na"
- )
- )
- 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 编辑
列出目录,
第一列是移动后的路径,第二列是移动前的路径- set _fld_=test
- for /f %%a in ('dir /b /ad %_fld_%') do (
- >>list.txt echo %%a
- for /f %%b in ('dir /b /ad %_fld_%\%%a') do (
- >>list.txt echo %%b \%%a\%%b
- if not exist %_fld_%\%%b (
- copy nul %_fld_%\%%b
- ) else (
- copy nul %_fld_%\%%a-%%b
- )
- )
- rmdir %%a
- )
复制代码
或者用占位文件模拟一次
作者: 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
由于批处理运行时是按顺序一行行执行的,上面所说的三步可以写在一个批处理里面。- @echo off
- for /r /d %%a in (*) do (
- dir /b /ad "%%a" | findstr . >nul || (
- for %%i in ("%%a\..") do move "%%a" "%%~dpa\..\%%~nxi_%%~na" >nul
- )
- )
- for /f "delims=" %%m in ('dir /ad /b /s^|sort /r') do rd "%%m" 2>nul
- setlocal enabledelayedexpansion
- for /r /d %%n in (*) do (
- dir /b /ad "%%n" | findstr . >nul || (
- set var=%%n
- set var=!var:*_=!
- ren "%%n" "!var!"
- )
- )
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |