我在一个目录中存储了大量文件,我希望根据文件名中的第一个世界将它们分类到子文件夹中。
因此,我有数千个 .pdf 文件,它们都有不同的首字(7 个数字字符)。
我还在同一个目录中拥有数千个文件夹,这些文件夹的第一个单词都有不同的 7 个数字字符。
我正在尝试将所有 .pdf 移动到具有相同首单词(7 个字符)的文件夹中。
所以我需要一个批处理文件,它本质上检查一个 pdf 文件并检查同一个目录,看是否已经存在一个具有相同前 7 个数字字符的文件夹,如果存在,则将 .pdf 移动到该文件夹中。
如果 .pdf 的文件夹不存在,它会根据 .pdf 文件的前七个字符创建一个文件夹。
例如,我有一个名为“1617832_XXXXXXXX_XXX.pdf”的 pdf 和一个名为“1617832_XXXXXXXX”的文件夹,它们位于同一目录中,我希望将“1617832_XXXXXXXXX_***.pdf”移动到现有文件夹“1617832_XXXXXXXXX”中。但是,如果文件夹“1617832_XXXXXXXXX”不存在,我希望创建一个名为“1617832”(文件的前七个字符)的文件夹。
完成后,它会转到下一个 .pdf“4530834__XXXXXXXX_XXX.pdf”并检查文件夹是否有一个具有相同第一个单词(七个字符)的匹配文件夹,然后将文件移动到该文件夹中(如果存在,否则创建一个新文件夹)。
唯一接近但运行时间太长并且如果文件夹不存在则不会创建文件夹的批处理是这个:
@echo on
setlocal enabledelayedexpansion
cls
pushd c:\folders\
for /f "tokens=*" %%1 in ('dir /a-d /b *') do (
set filename=%%1&set dirname=!filename:~0,7!
for /f "tokens=*" %%A in ('dir /ad /b') do (
set dirid=%%A&set dirid=!dirid:~0,7!
if "!dirid!" equ "!dirname!" move %%1 %%A
)
)
有什么方法可以更高效、更有效地做到这一点?
答案1
测试一下:
@echo off
setlocal EnableDelayedExpansion
REM Put here the path where the PDFs are:
set "Source=%userprofile%\Desktop\test"
for %%a in ("%Source%\*.PDF") do (
set "File=%%~na"
for /d %%b in ("%Source%\*") do (
set "Folder=%%~nb"
If "!File:~0,7!"=="!Folder:~0,7!" Move "%%a" "%%b"
)
if Exist "%%a" md "!Source!\!File:~0,7!"& move /y "%%a" "!Source!\!File:~0,7!"
)
答案2
- 更新考虑到这个评论:是的,如果两个文件夹的前 7 个字符匹配,我希望将文件移动到具有相同前 7 个字符的两个文件夹中
您不能使用移动命令,因为移动后,无法将其(移动的文件)的另一个副本复制到前 7 个字符匹配的另一个文件夹中...该命令必须进行复制,而不是移动文件...
@echo off && setlocal enabledelayedexpansion
cd /d "O:\Path\Operations\Blank\Blanky\Blank Blank" && cls
for /f tokens^=* %%i in ('dir /a:d .\* /b ')do set "_folder=%%~ni" && if exist ".\%%~ni*.pdf" (
for /f tokens^=* %%F in ('dir /a:d /b ".\!_folder:~0,7!*"')do copy ".\%%~ni*.pdf" "%%~dpnF\." )
for %%F in (*.pdf)do set "_file=%%~nF" && call set "_file=!_file:~0,7!" && (
if not exist .\!_file!\. md .\!_file!\ && copy /y "%%~dpnxF" ".\!_file!\." )
:: Deleting these files was copied to multiple folders instead of being moved to folder...
(echo/ if exist .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF
首先处理文件夹,看看是否有文件匹配;之后,检查文件夹中没有目标的剩余文件
如果所有文件都已复制到相应文件夹,则需要删除此文件:只需删除echo /
命令:
(回声/如果存在 .\*.pdf del .\*.pdf /q /f ) & %__APPDIR__%timeout.exe -1 & endlocal && goto :EOF