How to delete files in a directory, that exist in another directory?

1

What I need is a 'subtract' operation on sets of files in different directories. Assuming this file system hierarchy:

A\1.txt
A\2.txt
A\3.txt

B\2.txt
B\4.txt

... I'd like to remove all files under A that also exist under B (no recursion, and I only need to compare file names).

The result should be:

A\1.txt
A\3.txt

(nothing changed in B\)

The target OS is Windows - either command line or a GUI tool. I'm also OK with a UNIX command-line approach - I have GnuWin32 installed.

Cristi Diaconescu

Posted 2011-08-31T11:56:51.497

Reputation: 2 810

Answers

4

Create a list of files in B\, replace B\ by A\ and remove them.

/bin/ls -1 B/ | xargs -I {} echo rm A/{}

remove the echo once you have it. For example:

$ ls A/
1 2 3
$ ls B/
1 2 
$ /bin/ls -1 B/ | xargs -I {} echo rm A/{}
rm A/1
rm A/2

If you have many files, I suggest doing something akin to

#!/bin/sh
for f in `ls -1 B/*`
do rm A/$f
done

Making sure that files with spaces and control character work is left as an exercise to the reader ^_-

Sardathrion - against SE abuse

Posted 2011-08-31T11:56:51.497

Reputation: 390

That's brilliant! Works for few files. I have a problem though: for > ~100 files I get the error "ls: write error: Invalid argument" and only a part of the output is printed (i.e. the last printed line is cut short). ls -1 by itself works just fine. Looks like xargs is reading just a chunk of what ls outputs. – Cristi Diaconescu – 2011-08-31T12:19:17.087

Ah, updated answer. – Sardathrion - against SE abuse – 2011-08-31T12:36:24.707