Finding and un-removing files that I did a ‘cvs remove’ on yesterday
Last July, I posted a bash shell script called ‘cvsrecent.bsh’, the purpose of which was “to get a list of CVS revisions and log messages for all checkins within the past (some number) of days.”
I’ve continued to use this script, to this day, but I found a shortcoming this morning that I hadn’t noticed before. It doesn’t find files that have been removed from your working directory or the repository. I removed some files from my working directory and did ‘cvs remove’ on them yesterday, and today I decided I need to undo that.
So, I wrote a set of commands to find and check out the last version of all files that were deleted some number of days ago. Here are the components I used:
First, a bash function to get previous revision of a file:
function cvsprev()
{
cvs -q log $@ | grep “^revision ” | head -2 | tail -1 | cut -f2 -d” ”
}
Next, a bash function to get the date for some number of days ago, and format it the way cvs likes it:
function getdaysagodate()
{
date –date=”$1 days ago” +”%Y-%m-%d”
}
Finally, here’s the set of commands I used to:
- find all the files that CVS put in the “Attic” some number of days ago (in my case, I used 1 (one) since I removed the files yesterday).
- for each file:
- get the full working-directory path
- find the last revision number, before it was removed
- do a ‘cvs update -r’ to check out the last version of the file
for f in `cvs -Q log -SNd “>=$(getdaysagodate 1)” | grep -A1 Attic | sed -e “s/^.*Attic.*$//” -e “s/^\-\-$//” -e “s/Working file: //”`;
do cvs update -r `cvsprev $f` $f;
done
Another command could be added to check those files back into CVS automatically, but I wasn’t 100% certain that I wanted to check all of them back in. I mainly just wanted to find them, and look at them. Maybe sometime I’ll update the cvsrecent.bsh script, so it can handle files that have been removed. At least I’m half-way there after having written these commands today.

