2

是否可以编写一个批处理文件来删除目录中文件根名称的前 n 个字符与该目录中任何其他文件名的前 n 个字符不匹配的目录中的所有文件?例如,假设目录包含以下内容:

Purcell_HenryA.txt
Purcell_HenryB.txt
Casaubon_IsaacA.txt

在这种情况下,我们希望删除目录中前 13 个字符与目录中任何其他文件的前 13 个字符不匹配的所有文件。(也就是说,我们只想删除 Casaubon_IsaacA.txt。)我已经找到了删除目录中所有具有唯一扩展名的文件的脚本,但不知道如何开始编写此脚本,因此将不胜感激对于该问题的任何线索。

4

4 回答 4

3
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET target=u:\testdir
DIR /b /a-d %target%
echo====^^ names IN DIR ^^===
SET length=13
SET match=:
SET "candidate="
FOR /f "delims=" %%i IN ('dir /b/a-d "%target%\*"') DO (
 SET filename=%%i
 SET section=!filename:~0,%length%!
 IF !section!==!match! (SET "candidate=") ELSE (
  IF DEFINED candidate ECHO(DEL %target%\!candidate!
  SET candidate=%%i
  SET match=!section!
 )
)
IF DEFINED candidate ECHO(DEL %target%\!candidate!
GOTO :EOF

测试结果:

abc123_uniquename.txt
another_uniquename.txt
duplicate_name1234.txt
duplicate_name1235.txt
duplicate_name1236.txt
hello.txt
repeated__name1236.txt
repeated__name1235.txt
unique__name1235.txt
===^ names IN DIR ^===
DEL u:\testdir\abc123_uniquename.txt
DEL u:\testdir\another_uniquename.txt
DEL u:\testdir\hello.txt
DEL u:\testdir\unique__name1235.txt

如果您在测试后感到满意,请将两者都ECHO(删除以激活删除功能。

于 2013-07-05T02:25:42.733 回答
3

这将检查 14 个字符及以上的根文件名 - 如果只有 1 个文件具有相同的前导 13 个字符,那么它将回显 del。移除回声以使其执行删除。

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /b /a-d') do (
set "part=%%~na"
if not "!part:~13,1!"=="" (
set "part=!part:~0,13!"
  for /f "delims=" %%b in ('dir /b /a-d "!part!*.*" ^|find /c "!part!" ') do (
   if %%b EQU 1 echo del "%%a"
  )
 )
)
于 2013-07-05T04:52:35.303 回答
3

对于此代码file name = name+extension

@echo off &SETLOCAL enabledelayedexpansion
FOR %%a IN (*) DO (
    SET "search=%%~a"
    IF "!search:~13!" neq "" (
        FOR /f "delims=[]" %%b IN ('dir /b /a-d /on "!search:~0,13!*" ^| find /n "!search:~0,13!"') DO SET found=%%b
        IF !found! equ 1 ECHO DEL "%%~a"
    )
)

而且因为我提供了一个与 foxidrive 非常相似的解决方案,所以这里是另一个:

@echo off &SETLOCAL enabledelayedexpansion
FOR %%a IN (*) DO (
    SET search=%%a
    IF "!search:~13!" neq "" SET /a $!search:~0,13!+=1 2>nul
)
FOR /f "tokens=1*delims=$=" %%a IN ('set "$"') DO if %%b equ 1 echo del "%%~a*"
于 2013-07-05T05:41:45.967 回答
0

我会这样做的方式如下,我将解释逻辑,然后让您进行编码。您会将所有文件名解析为变量,同时每次都增加。然后,您将对要通过的循环数设置限制。然后您将搜索文件名的前 13 个字符,如果行数等于 1,则将其删除。在您将变量增加 1 并通过循环后,在每个循环结束时,它将检查它是否已达到限制,即目录中的文件数,如果已达到限制,则结束循环,否则继续。

哈,在一个人决定将我描述的想法用于实际代码之后,我终于决定这样做,无论如何,这比他的经过测试+验证的工作要短得多且快得多:

@echo off & setlocal enabledelayedexpansion
set dir=directoryyouwanttosearchin
for /f "delims=" %%a in ('dir /A:a /b %dir%') do set /A name+=1 & set file!name!=%%a
:LOOP
set /A cnt+=1
for /f "delims=" %%a in ('dir /A:a /b %dir% ^| find /C /I "!file%cnt%:~0,13!"') do set lines=%%a
if %lines%==1 del %dir%\!file%cnt%! > nul
if %cnt% NEQ %name% Goto :LOOP
exit /b

那是9行:)。

于 2013-07-05T02:17:48.307 回答