Board logo

标题: [文件操作] 批处理获取指定深度的文件夹名字和文件名字 [打印本页]

作者: 水煮水    时间: 2024-12-4 20:27     标题: 批处理获取指定深度的文件夹名字和文件名字

求助一个批处理,允许我指定路径,允许我指定路径的深度N(N=1代表1级,N=2代表2级,以此类推)
比如我有以下文件结构
D:\ftp\迁移后的总说明.doc
D:\ftp\2022年\
D:\ftp\2023年\1月\5日\1.jpg
D:\ftp\2023年\2月\22.txt
D:\ftp\2023年\说明.doc
D:\ftp\2024年\11月\汇总.xls
D:\ftp\2024年\11月\21日\数据.xlsx
D:\ftp\2024年\11月\22日\客户要求.doc


比如我指定的路径是D:\ftp,N=1,意思就是获取这个路径下的第一层的文件及文件夹,批处理后就输出【迁移后的总说明.doc,2022年,2023年,2024年】
比如我指定的路径是D:\ftp,N=2,意思就是获取这个路径下的第二层的文件及文件夹,批处理后就输出【1月,2月,说明.doc,11月】
比如我指定的是路径是D:\ftp\2024年,N=1,意思就是获取这个路径下的第一层的文件及文件夹,批处理后就输出【11月】
比如我指定的是路径是D:\ftp\2024年,N=2,意思就是获取这个路径下的第二层的文件及文件夹,批处理后就输出【汇总.xls,21日,22日】
比如我指定的是路径是D:\ftp\2024年,N=3,意思就是获取这个路径下的第三层的文件及文件夹,批处理后就输出【数据.xlsx,客户要求.doc】

感谢各位!
作者: Five66    时间: 2024-12-4 23:30

本帖最后由 Five66 于 2024-12-5 00:09 编辑

不知行否 ,深度52以内
(忘了文件夹了,已编辑)
  1. @echo off
  2. set "lujing=D:\ftp"
  3. set N=2
  4. set "_= qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  5. setlocal enabledelayedexpansion
  6. pushd "%lujing%"
  7. set /a ____=%N%-1&set "_d= /d"
  8. for /l %%- in (1 1 %____%) do (
  9. set _a=!_:~%%-,2!&set _b=!_a:~1,1!
  10. set _a=!_a:~0,1!
  11. if %%- == %____% (
  12. set __=!__!dir /b "%%!_a!\*"
  13. ) else (
  14. set __=!__!for!_d! %%!_b! in ^(^"%%!_a!\*^"^) do ^(
  15. set "___=!___!)"
  16. ))
  17. if %N% == 1 set "_cmd=dir /b"
  18. if %N% geq 2 set "_cmd=for /d %%q in (*) do (!__!%___%)"
  19. %_cmd%
  20. popd&echo,&endlocal&pause&exit/b
复制代码

作者: wanghan519    时间: 2024-12-5 06:13

本帖最后由 wanghan519 于 2024-12-5 07:48 编辑
  1. find . -mindepth 5 -maxdepth 5 -exec basename {} \;
复制代码
需要第三方busybox.exe
不过还是everything更快,比如windows目录里只找出了13层的文件,没有14层的
  1. windows\ depth:13
复制代码

作者: 水煮水    时间: 2024-12-5 09:26

回复 2# Five66


    试了下,能获取到,感谢感谢 ,然后再问下,能不能加一句代码,让获取到的文件和文件夹名字生成到txt
作者: aloha20200628    时间: 2024-12-5 12:30

本帖最后由 aloha20200628 于 2024-12-5 15:16 编辑

回复 1# 水煮水

可以从 dir/b/s 的一次运行结果(全路径列表)中直接抽取所需数据,以下代码存为 test.bat 运行,结果存为 test.bat 所在目录下的 all.lst 文件,代码中第一行可自定义变量 d 为 ‘目标目录(全路径)’ 和变量 n 为 ‘目录层级’ ...
  1. @echo off &setlocal enabledelayedexpansion &set "d=d:\ftp\2024" &set "n=3"
  2. echo,"!d!">-.-&for %%F in (-.-) do set "v=%%~zF"
  3. echo,"!d:\=!">-.-&for %%F in (-.-) do set/a "n+=!v!-%%~zF-1"
  4. del/q "-.-"&cd /d "!d!" &set "_d=:\\[^\\]*"
  5. for /l %%n in (1,1,!n!) do set "_d=!_d!\\[^^\\]*"
  6. dir /b/s|findstr /ric:"!_d!$">"%~dp0\all.lst"
  7. type "%~dp0\all.lst"&endlocal&pause&exit/b
复制代码

作者: went    时间: 2024-12-5 14:18

递归版本 效率未知
第二行设置目录(\结尾),第三行设置深度为10
  1. @echo off & cd /d "%~dp0"
  2. set "dir=C:\Users\Administrator\Desktop\SYNC\"
  3. call :enum_dir "%dir%" 10 0
  4. pause&exit
  5. :enum_dir
  6. set /a "dep=%~3+1"
  7. if %dep% equ %~2 (
  8. dir /b "%~1"
  9. goto :eof
  10. )
  11. if %dep% lss %~2 for /d %%i in ("%~1*") do call :enum_dir "%%~i\" %~2 %dep%
  12. goto :eof
复制代码

作者: 77七    时间: 2024-12-5 14:43

  1. @echo off
  2. set folder=d:\a
  3. set n=3
  4. (set /a "(m=1)/(n-=1)" 2>nul && call :1 "%folder%" || dir /b "%folder%") > "%~dp0\list_%n%.txt"
  5. pause
  6. exit
  7. :1
  8. for /d %%d in ("%~1\*") do (
  9. set /a m=%m%+1,"1/(n-%m%)" 2>nul && call :1 "%%d" || dir /b "%%d"
  10. )
  11. exit /b
复制代码

作者: Five66    时间: 2024-12-5 18:53

回复 4# 水煮水


    将2楼代码第21行的
  1. %cmd%
复制代码
换成
  1. popd&set "_out=!cd!\___list.txt"
  2. pushd "!lujing!"
  3. (
  4. %_cmd%
  5. )>"!_out!"
  6. type "!_out!"
复制代码
会创建一个名字为___list.txt ,txt的编码为ANSI (简体中文系统的gbk/gb2312)




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