Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm about to remove an old backup directory, but before doing so I'd like to make sure that all these files exist in a newer directory.

Is there a tool for this? Or am I best off doing this "manually" using find, md5sum, sorting, comparing, etc?


If I have the following directory listings




then fileA and fileB exists in new_backup (fileA in its original directory, and fileB has moved from dir1 to dir2). fileC on the other hand is missing in new_backup and fileD has been created. In this situation I'd like the output to be something like

fileC exists in old_backup, but not in new_backup.
share|improve this question
You're going to have to hack something up yourself, especially if you want to be able to detect that a file with a different name has the same contents (and thus can be ignored). It'll only be a few lines, though. – womble Jun 10 '12 at 7:48

Python has some nice standard library modules for this called dircmp/filecmp.

From Doug Hellmann's PyMOTW, This little bit of code gives you:

import filecmp

filecmp.dircmp('example/dir1', 'example/dir2').report()

Gives you:

diff example/dir1 example/dir2
Only in example/dir1 : ['dir_only_in_dir1', 'file_only_in_dir1']
Only in example/dir2 : ['dir_only_in_dir2', 'file_only_in_dir2']
Identical files : ['common_file', 'not_the_same']
Common subdirectories : ['common_dir']
Common funny cases : ['file_in_dir1']

Doug explains the full skinny on filecmp/dircmp way better than I can at:

I like python for things like this because it ports much more easily between Linux/Windows/Solaris for me than anything shell based.

share|improve this answer

I'd make my own tool. Go the manual route for this one with some fancy find-ings:

find /oldbackup -exec basename {} ";" > /tmp/old.txt
find /newbackup -exec basename {} ";" > /tmp/new.txt
for $filename in `cat /tmp/old.txt`
    grep $filename /tmp/new.txt
    if [ "$?" -ne "0" ];
       echo "$filename not in new backup"

That's incredibly sloppy, but the basic algorithm should be alright. You could also do some catting to figure out which files didn't have copies in both like so:

find /oldbackup -exec basename {} ";" > /tmp/old.txt
find /newbackup -exec basename {} ";" > /tmp/new.txt
cat /tmp/old.txt /tmp/new.txt | sort | uniq -c | grep -v 2

I can explain the bits and pieces if you need.

share|improve this answer
find ... -exec basename {} \; ... – Iain Jun 10 '12 at 7:58
Genious! I've been doing it the hard way all these years :D – RandomInsano Jun 10 '12 at 8:00
I should mention that second bit's going to be useless/buggy if the same file names can exist in different folders. – RandomInsano Jun 10 '12 at 8:01

Use diff -uRN dir1 dir2

The diff will be empty if the files are perfect... Or it'll show!

share|improve this answer
Aha. Sounds reasonable. (I forgot to write it in the question) but I'd like to ignore file paths :-/ – aioobe Jun 10 '12 at 7:17
I didn't get this part.... you just want a 'yes' or 'no' as the output? – Karthik Kumar Viswanathan Jun 10 '12 at 7:19
Updated question with an example. – aioobe Jun 10 '12 at 7:26

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.