Board logo

标题: [文件操作] 求助批处理循环遍历指定文件夹下的文件获取文件名,比对某文件内的文本内容 [打印本页]

作者: 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 编辑

这是无后缀:
  1. @echo off
  2. for /f "delims=" %%a in (B文件夹\list.txt) do (
  3. if exist A文件夹\%%a copy A文件夹\%%a C文件夹
  4. ))
复制代码
这是有后缀:
  1. @echo off
  2. for /f "delims=" %%a in (B文件夹\list.txt) do (
  3. if exist A文件夹\%%a.* copy A文件夹\%%a.* C文件夹
  4. ))
复制代码

作者: 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
  1. @echo off
  2. cd /d "%~d
  3. for /f "delims=" %%a in ('type "B.txt"') do (
  4.     echo 正在检查字符串 %%a
  5.     if exist "A\%%a" (
  6.         copy /y "A\%%a" "C\"
  7.     ) else (
  8.         echo 找不到文件 A\%%a
  9.     )
  10. )
  11. 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://bbs.bathome.net/) Powered by Discuz! 7.2