从列表中复制具有特定名称和升序数字的文件

从列表中复制具有特定名称和升序数字的文件

我有一个文件夹,里面有几千个以特定方式命名的 pdf 文件,还有一串我想复制到另一个文件夹的文件。

- "abcd0000000001-00.pdf"
- "abcd0000000001-01.pdf"
- "abcd0000000001-02.pdf"  // copy abcd0000000001-02.pdf
- "abcd0000000002-00.pdf"
- "abcd0000000002-01.pdf"
- "abcd0000000002-02.pdf"
- "abcd0000000002-03.pdf"  // copy abcd0000000002-03.pdf
- "abcd0000000003-00.pdf"
- "abcd0000000003-01.pdf"
- "abcd0000000004-00.pdf"
- "abcd0000000004-01.pdf"  
- "abcd0000000004-02.pdf"
- "abcd0000000004-03.pdf"
- "abcd0000000004-04.pdf"  // copy abcd0000000004-04.pdf
- ...
- "abcd000000000n-nn.pdf" //  copy abcd000000000n-[highest].pdf

我不想复制每个 pdf 文件,只想复制每个文件中升序数字最高的文件。

我发现这个代码呕吐 - Chunky Mess 风格

FOR /F "USEBACKQ TOKENS=*" %F IN ("C:\Folder\FileList.txt") DO XCOPY /F /Y "C:\SourceFolder\%~F" "C:\DestinationFolder\"

我该如何编辑此行代码以每次获取最高的升序数字?

答案1

另一个答案是不需要批处理或代码,您可以在 Syncback 和 Gs Richcopy 等工具中使用可行的功能,这些功能支持通配符来包含/排除文件,请尝试联系他们进行免费试用

答案2

试试这个批处理文件。将以下代码复制到记事本,然后根据需要编辑此部分:

:: Set the location of the file list here:
set List=c:\files.txt
:: Set the location of the source files here:
set Source=c:\Source
:: Set the location of the desired destination here:
set Destiny=c:\Destiny

然后使用您想要的名称保存文件,但扩展名为 *.bat,然后双击它。

@echo off

:: Set the location of the file list here:
set List=c:\files.txt
:: Set the location of the source files here:
set Source=c:\Source
:: Set the location of the desired destination here:
set Destiny=c:\Destiny

if not exist "%List%" echo  Error: The file list doesn't seem to exist& pause& exit
if not exist "%Source%" echo Error: The Source folder doesn't seem to exist& pause& exit

if not exist "%Destiny%" md "%Destiny%"
set NameA=
set NameB=

for /f "delims=" %%a in ('type "%List%" ^|find /i "-" ^|sort /r') do call :CopyL "%%~a"

pause
exit

:CopyL

for /f "tokens=1* delims=-" %%a in ("%~1") do (
                                               if not "%NameA%"=="%%a" copy "%Source%\%~1" "%Destiny%\"
                                               set NameA=%%a
                                               set NameB=%%b
                                              )

goto :EOF

正如您在我的测试环境中看到的,它仅复制编号最高的组的文件,而忽略名称中没有连字符的文件(纽约):

复制文件.gif

答案3

  • 从您的文件列表...

循环列出您的文件For /F并获取在第一个标记中返回的字符串 e(默认)并将-其设置为分隔符,然后按名称以相反的顺序列出过滤您的文件,如果目标文件夹中不存在则复制第一个...

@echo off

cd/d "D:\The\Full\Path\To\Your\.Pdf\Files\Folder"
set "_list=D:\The\Full\Path\To\Your\List\File.txt"
set "_target=D:\The\Full\Path\To\Your\Target\Folder"

for /f "usebackdelims=-" %%a in (`type "%_list%"^|findstr \-[0-9][0-9]\.pdf
   `)do for /f "tokens=*delims=-" %%i in ('dir /o:-n /a:-d /b "%%~a-??.pdf"
       ')do if not exist "%_target%\%%~a-??.pdf" ;copy "%%~fi" "%_target%\"

  • 无文件列表

按名称的相反顺序列出您的文件/o-n,当文件夹中不存在每个文件时复制它,假设/用 替换-NumberNumber分隔符-??

@echo off 

cd /d "D:\The\Full\Path\To\Your\.Pdf\Files\Folder"
set "_Target_Dir=D:\The\Full\Path\To\Your\Target\Folder"

for /f tokens^=1*delims^=- %%i in ('dir /o-n /a-d /b *-??.pdf
   ')do if not exist "%_Target_Dir%\%%~i-??.pdf" copy "%%~i-%%~j" "%_Target_Dir%"

其他资源:

相关内容