kurokirasama
kurokirasama

Reputation: 777

Batch script to remove "duplicate" files

I have a list of files named:

file.txt
file (1).txt
file (2).txt

etc.

Where the greater (number) is the last file updated.

I want a .bat script that allows get the content of file (maxnumer).txt to file.txt.

Upvotes: 0

Views: 3161

Answers (2)

Some_Guy
Some_Guy

Reputation: 494

Here is a bit of a hacky answer.

This script will move all files from file (1).txt up to file (10).txt to file.txt , leaving only file.txt which now contains the text that was in file (10).txt

Doing it in ascending order will ensure the highest number that exists is the last one to be moved.

@echo off
set /P name=Enter name of file without extension: 
echo enter extension:
set /P ext=.
echo. & echo.
echo these actions will be performed: & echo.
FOR /L %%A IN (1,1,10) DO @echo move /y "%name% (%%A).%ext%" "%name%.%ext%"
echo. & pause & echo.
FOR /L %%A IN (1,1,10) DO       move /y "%name% (%%A).%ext%" "%name%.%ext%"
pause

You could use IF EXIST %name% (%%A).%ext% To stop the script from trying to move files that don't exist, but it doesn't really affect anything to do that, so I didn't bother.

The script above will do it for a specific named file. To do it for all files in a directory will be possible, here are some hints to get you going

use a dir /b >filenames.txt to get all files in a directory listed in a text file

to perform an action for every line in a textfile do

for /f "usebackq delims= tokens=* %%a in (`filenames.txt`)" DO (
    ::some stuff here
)

The way I would go about it would be to get filenames.txt , manually delete all the (n) files so you just have a list of the "non-duplicate" filenames, and use that as your input. You

There are probably more elegant solutions out there, but with all the peculiarities of batch I wouldn't be surprised to find they are pages and pages long.

If you want to keep all the original files not just end up with the final file.txt with no copies, then I you want to use COPY

If you want to keep all the original files, then you would want to use COPY not MOVE.

In that case, to remove all superfluous operations (i.e. only copy the highest numbered file, not copy all the files in order) then something like IF NOT EXIST %name% (!B!).%ext% where !B!=%%A+1 within your (now multiline) for loop and use Setlocal EnableDelayedExpansion on to make the arithmetic work properly. But it's not really necessary, copying 1, then 2, then 3, then 4 does the same thing if a little slower than skipping 1 2 and 3 and just doing 4.

I hope this helps enough to point you in the right direction, feel free to ask questions if this isn't clear.

Upvotes: 1

JosefZ
JosefZ

Reputation: 30103

dir /B /OD /TW file*.txt lists file names in sort order of last written time (cf. dir /?).

Next commented batch script could do the job for you:

@echo OFF
SETLOCAL EnableExtensions
rem delete empty `_lastfile` variable
set "_lastfile="
rem store file name of last written time into `_lastfile` variable
for /F "delims=" %%G in ('dir /B /OD /TW file*.txt 2^>NUL') do set "_lastfile=%%~G"
rem                                                ↑↑↑↑↑↑ suppress errors
rem check the `_lastfile` variable
rem is defined?
rem                  AND is different from "file.txt"?
if defined _lastfile if /I "%_lastfile%" NEQ "file.txt" copy /Y "%_lastfile%" "file.txt"

Resources (required reading):

Upvotes: 4

Related Questions