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

[文本处理] [已解决]将目录下txt文件移动到以txt文件第一个连续字母命名的文件夹中

[复制链接]
发表于 2024-6-10 19:47:51 | 显示全部楼层 |阅读模式
本帖最后由 cckkaa888 于 2025-4-13 16:41 编辑

将目录下txt文件移动到该目录下子文件夹{以txt文件第一个连续字母命名的,连续字母不包含一个字母的}中,如果没有就创建这个文件夹并且移动。
例如
将"123_zhangsan456@张三abc.tx"t移动到"zhangsan"文件夹中,
将"h-123lisi@李四.txt"移动到"lisi"文件夹中
发表于 2024-6-13 08:09:05 | 显示全部楼层
本帖最后由 WHY 于 2024-6-13 08:13 编辑
  1. PowerShell "dir *.txt -file | ?{$_.BaseName -match '[a-z]{2,}'} | forEach {$fd=$matches[0]; md $fd -ea SilentlyContinue; mv $_.FullName -Dest $fd}"
复制代码
  1. @if(0)==(0) echo off
  2. for /f "tokens=1*" %%i in ('dir /b /a-d *.txt ^| cscript -nologo -e:jscript "%~f0"') do (
  3.     md %%i\ 2>nul
  4.     move "%%j" %%i\
  5. )
  6. pause & exit/b
  7. @end

  8. while (!WSH.StdIn.AtEndOfStream) {
  9.     var f = WSH.StdIn.ReadLine();
  10.     var m = f.slice(0,-3).match(/[a-z]{2,}/i);
  11.     if(m) WSH.Echo(m[0] + ' ' + f);
  12. }
复制代码
发表于 2024-6-12 11:17:57 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-6-12 15:17 编辑


凡是提供正则匹配替换方法的脚本(如jscript/vbs/powershell/python/...)均可增援纯P代码以便其整个脚本代码轻量化...
以下代码调用jscript正则替换方法,存为test.bat,置于目标文件(*.txt)所在目录下运行...

  1. @set @x=1 /* &@echo off
  2. for /f "delims=" %%a in ('dir /b/a-d *.txt') do for /f "delims=" %%d in (
  3.         ' cscript /nologo /e:jscript "%~f0" "%%a" ') do (md "%%d" 2>nul & move /y "%%a" "%%d")
  4. pause&exit/b */
  5. v = WSH.arguments; WSH.echo(v(0).match(/[a-z]{2,}/i)[0]); WSH.quit();
复制代码
发表于 2024-6-11 18:50:29 | 显示全部楼层
本帖最后由 newswan 于 2024-6-12 09:36 编辑

Powershell

  1. $sour = "D:\work"
  2. Push-Location -Paht $sour
  3. Get-ChildItem -Filter "*.txt" | ForEach-Object {
  4.         $str = $_.BaseName -replace ".*?([a-zA-Z]{2,}).*",'$1'
  5.         if ( -Not ( Test-Path $str ) ) {
  6.                 New-Item -Type Directory -Path $str
  7.         }
  8.         Move-Item -Path $_ -Destination $str
  9. }
  10. Pop-Location
复制代码
发表于 2024-6-11 18:45:43 | 显示全部楼层
  1. echo "a123bcd4sd" | grep -Eo "[a-zA-Z]{2,}"
复制代码
发表于 2024-6-11 15:09:58 | 显示全部楼层
回复 2# 77七


   去除多余判断,优化下逻辑...
  1. @echo off
  2. cd /d "%~dp0"
  3. set az=qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5.         set f=%%i
  6.         call :1 "%%~ni"
  7. )
  8. pause
  9. exit

  10.         :1
  11.         set "str=/%~1"
  12.         for /f "tokens=1* delims=%az%" %%a in ("%str%") do (
  13.                 if "%%b" neq "" (
  14.                         call set "str=%%str:%%a=%%"
  15.                         call set "str=%%str:%%b=%%"
  16.                         setlocal enabledelayedexpansion
  17.                         if "!str:~1!" equ "" (
  18.                                 endlocal
  19.                                 call :1 "%%b"
  20.                         ) else (
  21.                                 md "!str!" 2>nul
  22.                                 echo move "!f!" "!str!"
  23.                                 move "!f!" "!str!"
  24.                                 endlocal
  25.                         )
  26.                 )
  27.         )
  28.         exit /b
复制代码
发表于 2024-6-10 22:07:38 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-6-10 22:35 编辑

回复 1# cckkaa888

给一个直接用递归方法 ‘截取文件名第一个多字母字段’ 的版本
以下代码存为 test.bat 置于目标文件(*.txt)所在目录下运行...

  1. @echo off
  2. for /f "delims=" %%a in ('dir /b/a-d *.txt') do (
  3.         set "s=%%a"&set "$a=%%a" &setlocal enabledelayedexpansion
  4.         set "_s="&set "_k=" & (call :getstr)
  5.         md "!_s!" 2>nul & move /y "!$a!" "!_s!" & endlocal
  6. )
  7. pause&exit/b
  8. :getstr
  9.         set "c=!s:~,1!" &if "!c!" geq "a" if "!c!" leq "Z" (
  10.                 set "s=!s:~1!"&set "_s=!_s!!c!"&set/a "_k+=1" & goto :getstr)
  11.         if !_k! geq 2 (exit/b) else (set "s=!s:~1!"&set "_s="&set "_k=" & goto :getstr)
  12.         exit/b
复制代码
发表于 2024-6-10 21:24:13 | 显示全部楼层
本帖最后由 77七 于 2024-6-11 12:34 编辑
  1. @echo off
  2. cd /d "%~dp0"
  3. set az=qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5.         set f=%%i
  6.         call :1 "%%~ni"
  7. )
  8. pause
  9. exit

  10.         :1
  11.         set "str=/%~1"
  12.         for /f "tokens=1* delims=%az%" %%a in ("%str%") do (
  13.                 set str_s=%%a
  14.                 set str_e=%%b
  15.         )
  16.         call set "str_m=%%str:%str_s%=%%"
  17.         if "%str_e%" neq "" (
  18.                 call set "str_m=%%str_m:%str_e%=%%"
  19.         )
  20.         if "%str_m%" neq "" (
  21.                 if "%str_m:~1%" equ "" (
  22.                         if "%str_e%" neq "" (
  23.                                 call :1 "%str_e%"
  24.                         )
  25.                 ) else (
  26.                         md "%str_m%" 2>nul
  27.                         echo move "%f%" "%str_m%"
  28.                         move "%f%" "%str_m%"
  29.                 )
  30.         )
  31.         exit /b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:21 , Processed in 0.021970 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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