标题: [文件操作] 批处理获取指定深度的文件夹名字和文件名字 [打印本页]
作者: 水煮水 时间: 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以内
(忘了文件夹了,已编辑)- @echo off
-
- set "lujing=D:\ftp"
- set N=2
-
- set "_= qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
- setlocal enabledelayedexpansion
- pushd "%lujing%"
- set /a ____=%N%-1&set "_d= /d"
- for /l %%- in (1 1 %____%) do (
- set _a=!_:~%%-,2!&set _b=!_a:~1,1!
- set _a=!_a:~0,1!
- if %%- == %____% (
- set __=!__!dir /b "%%!_a!\*"
- ) else (
- set __=!__!for!_d! %%!_b! in ^(^"%%!_a!\*^"^) do ^(
- set "___=!___!)"
- ))
- if %N% == 1 set "_cmd=dir /b"
- if %N% geq 2 set "_cmd=for /d %%q in (*) do (!__!%___%)"
- %_cmd%
- popd&echo,&endlocal&pause&exit/b
复制代码
作者: wanghan519 时间: 2024-12-5 06:13
本帖最后由 wanghan519 于 2024-12-5 07:48 编辑
- find . -mindepth 5 -maxdepth 5 -exec basename {} \;
复制代码
需要第三方busybox.exe
不过还是everything更快,比如windows目录里只找出了13层的文件,没有14层的复制代码
作者: 水煮水 时间: 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 为 ‘目录层级’ ...- @echo off &setlocal enabledelayedexpansion &set "d=d:\ftp\2024" &set "n=3"
- echo,"!d!">-.-&for %%F in (-.-) do set "v=%%~zF"
- echo,"!d:\=!">-.-&for %%F in (-.-) do set/a "n+=!v!-%%~zF-1"
- del/q "-.-"&cd /d "!d!" &set "_d=:\\[^\\]*"
- for /l %%n in (1,1,!n!) do set "_d=!_d!\\[^^\\]*"
- dir /b/s|findstr /ric:"!_d!$">"%~dp0\all.lst"
- type "%~dp0\all.lst"&endlocal&pause&exit/b
复制代码
作者: went 时间: 2024-12-5 14:18
递归版本 效率未知
第二行设置目录(\结尾),第三行设置深度为10- @echo off & cd /d "%~dp0"
- set "dir=C:\Users\Administrator\Desktop\SYNC\"
- call :enum_dir "%dir%" 10 0
- pause&exit
-
- :enum_dir
- set /a "dep=%~3+1"
- if %dep% equ %~2 (
- dir /b "%~1"
- goto :eof
- )
- if %dep% lss %~2 for /d %%i in ("%~1*") do call :enum_dir "%%~i\" %~2 %dep%
- goto :eof
复制代码
作者: 77七 时间: 2024-12-5 14:43
- @echo off
- set folder=d:\a
- set n=3
-
- (set /a "(m=1)/(n-=1)" 2>nul && call :1 "%folder%" || dir /b "%folder%") > "%~dp0\list_%n%.txt"
- pause
- exit
-
- :1
- for /d %%d in ("%~1\*") do (
- set /a m=%m%+1,"1/(n-%m%)" 2>nul && call :1 "%%d" || dir /b "%%d"
- )
- exit /b
复制代码
作者: Five66 时间: 2024-12-5 18:53
回复 4# 水煮水
将2楼代码第21行的复制代码
换成- popd&set "_out=!cd!\___list.txt"
- pushd "!lujing!"
- (
- %_cmd%
- )>"!_out!"
- type "!_out!"
复制代码
会创建一个名字为___list.txt ,txt的编码为ANSI (简体中文系统的gbk/gb2312)
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |