标题: [文件操作] 求助批处理循环遍历指定文件夹下的文件获取文件名,比对某文件内的文本内容 [打印本页]
作者: eleven11 时间: 2022-7-28 09:11 标题: 求助批处理循环遍历指定文件夹下的文件获取文件名,比对某文件内的文本内容
背景:
1、文件夹A 下 有10W个文件(无子文件夹),文件名杂乱无序的字符串(A1~AN);
2、文件B是一个txt文件,里面有4W行,每一行是一个字符串(如A5)。
3、文件夹C
想要达到的效果:
遍历文件夹A,获取其下的10W个文件的文件名,循环比对文件B的行内容,若两者相等,则将A下的文件复制或移动到文件夹C下。(由原来:A\A5 变成 现在的 C\A5)
作者: LJY4.0 时间: 2022-7-28 09:19
本帖最后由 LJY4.0 于 2022-7-28 09:21 编辑
请问文件是否有后缀
比如.txt
作者: LJY4.0 时间: 2022-7-28 09:27
本帖最后由 LJY4.0 于 2022-7-28 10:04 编辑
这是无后缀:- @echo off
- for /f "delims=" %%a in (B文件夹\list.txt) do (
- if exist A文件夹\%%a copy A文件夹\%%a C文件夹
- ))
复制代码
这是有后缀:- @echo off
- for /f "delims=" %%a in (B文件夹\list.txt) do (
- if exist A文件夹\%%a.* copy A文件夹\%%a.* C文件夹
- ))
复制代码
作者: eleven11 时间: 2022-7-28 09:27
回复 2# LJY4.0
文件夹A下的文件名吗? 没有后缀
作者: hfxiang 时间: 2022-7-28 09:43
本帖最后由 hfxiang 于 2022-7-28 13:10 编辑
@echo off & setlocal
for /f "delims==" %%a in ('set Files_Name_ID[ 2^>nul') do set "%%a="
for /f "usebackq tokens=*" %%a in ("B文件") do set "Files_Name_ID[%%a]=True"
cd /d "A文件夹"
for %%a in (*.*) do (
if defined Files_Name_ID[%%a] move "A文件夹\%%a" "C文件夹"
)
endlocal
作者: eleven11 时间: 2022-7-28 09:48
回复 3# LJY4.0
执行了几分钟,有两个问题,
1、命令窗口一直在开着,不知道啥时候结束。
2、文件没有复制到文件夹C下
作者: LJY4.0 时间: 2022-7-28 09:56
本帖最后由 LJY4.0 于 2022-7-28 10:04 编辑
回复 6# eleven11
已在3楼修改
速度会快一点,时间花在读取和复制
作者: eleven11 时间: 2022-7-28 10:01
回复 5# hfxiang
无效果...
1、桌面新建文件夹,新建files.bat和list.txt两个文件,把命令放入files.bat ,list.txt写入12 13 14 15换行。
2、在F:\tmp 文件夹下 新建12 13文件。
3、把files.bat的B文件改成list.txt,把A文件夹替换成F:\tmp,把C文件夹 替换桌面\新建文件夹。
作者: LJY4.0 时间: 2022-7-28 10:09
我兜了一大个圈子才完成
之前是获取所有文件名再判断复制
现在是判断再复制
作者: eleven11 时间: 2022-7-28 10:10
回复 7# LJY4.0
@echo off
for /f "delims=" %%a in (C:\Users\Administrator\Desktop\新建文件夹\list.txt) do (
for /f "delims=." %%b in ('dir /s/a-d/b F:\tmp\*') do (
if not exist %%a goto over
if "%%a"=="%%b" copy F:\tmp\%%b C:\Users\Administrator\Desktop\新建文件夹
ver
))
文件分布:
C:\Users\Administrator\Desktop\新建文件夹\list.txt
其中list.txt 内容是
12
13
14
C:\Users\Administrator\Desktop\新建文件夹\files2.bat
F:\tmp\12
F:\tmp\13
F:\tmp\20
最终效果是 C:\Users\Administrator\Desktop\新建文件夹\12
C:\Users\Administrator\Desktop\新建文件夹\13
作者: eleven11 时间: 2022-7-28 10:12
回复 9# LJY4.0
我理解应该是笛卡尔积的方式 嵌套for循环。然后比对 比对成功后 移动或复制 我现在测试情况数量较少
作者: LJY4.0 时间: 2022-7-28 10:15
回复 11# eleven11
试试新版本
作者: Batcher 时间: 2022-7-28 11:53
回复 1# eleven11
目录结构如下:
test.bat
B.txt
A\10万个文件
C\
请参考Q-04和Q-05把bat文件和txt文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA- @echo off
- cd /d "%~d
- for /f "delims=" %%a in ('type "B.txt"') do (
- echo 正在检查字符串 %%a
- if exist "A\%%a" (
- copy /y "A\%%a" "C\"
- ) else (
- echo 找不到文件 A\%%a
- )
- )
- pause
复制代码
作者: aloha20200628 时间: 2022-7-28 12:10
试一下findstr的效率...目录可据实值调整
@echo off
set B4w="d:\B\b4w.lst"
set toC="d:\C"
cd/d "d:\A"
dir/b/a-d>"A10w.lst"
findstr /r /g:"%B4w%">"BfromA.lst"
for /f "usebackq delims=" %%F in ("BfromA.lst") do (copy /y "%%~F" %toC%)
del/q "A10w.lst" "BfromA.lst"
exit/b
作者: hfxiang 时间: 2022-7-28 13:16
回复 8# eleven11
经检查是键入错误,把 for /f "usebackq tokens=*" %%a in ("B文件") do set "Files_Name_ID[%%a]=True"
录入成 for /f "usebackq tokens=*" %%a in ("B文件") do set "Name_ID[%%a]=True"
也就是说该行的set "Name_ID[%%a]=True"应该为set "Files_Name_ID[%%a]=True",目前5楼已修改,并通过测试。
实测代码如下:
@echo off & setlocal
for /f "delims==" %%a in ('set Files_Name_ID[ 2^>nul') do set "%%a="
for /f "usebackq tokens=*" %%a in ("d:\Data\temp\B.txt") do set "Files_Name_ID[%%a]=True"
cd /d "d:\Data\1"
for %%a in (*.*) do (
if defined Files_Name_ID[%%a] move "d:\Data\1\%%a" "d:\Data\tmp"
)
endlocal
作者: eleven11 时间: 2022-7-28 13:42
回复 15# hfxiang
感谢
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |