找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 11399|回复: 7

[文件操作] 批处理获取指定深度的文件夹名字和文件名字

[复制链接]
发表于 2024-12-4 20:27:54 | 显示全部楼层 |阅读模式
求助一个批处理,允许我指定路径,允许我指定路径的深度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】

感谢各位!
发表于 2024-12-4 23:30:00 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2024-12-5 06:13:36 | 显示全部楼层
本帖最后由 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:59 | 显示全部楼层
回复 2# Five66


    试了下,能获取到,感谢感谢 ,然后再问下,能不能加一句代码,让获取到的文件和文件夹名字生成到txt
发表于 2024-12-5 12:30:03 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2024-12-5 14:18:45 | 显示全部楼层
递归版本 效率未知
第二行设置目录(\结尾),第三行设置深度为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
复制代码
发表于 2024-12-5 14:43:12 | 显示全部楼层
  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
复制代码
发表于 2024-12-5 18:53:23 | 显示全部楼层
回复 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)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:23 , Processed in 0.028846 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表