Monthly Archives: November 2009

Killing “find” Errors

I’ve used the unix filesystem search utility find for many years. Though, like most things, until forced to learn its deeper secrets, I generally get by with only the most basic knowledge.

One of the cool things about find is that you can specify a search and then execute an action on the results, all in one command.

This example is probably my most common use of find:

find . -type d -name .svn -exec rm -fr {} \;

This means: find, in the current directory (.), a directory (-type d), named .svn (-name .svn), and for every result (-exec) remove that directory (rm -fr {}) .  The “{}” represents the matched path string, and the “\;” is required to end the “-exec” command.

Here’s a sample of what this looks like, including output:

$ find . -type d -name .svn -exec rm -fr {} \;
find: ./.svn: No such file or directory
find: ./getid3-2.0.0b4/.svn: No such file or directory
find: ./getid3-2.0.0b4/extras/.svn: No such file or directory
find: ./getid3-2.0.0b4/getid3/.svn: No such file or directory

This is great, and I’ve used this exact syntax for years. But today I ran into a problem. I wanted to run this exact command as part of a custom build script in Xcode. When this command ran I had 81 errors popup in my build results! What happened is that all thos “No such file or directory” messages are actually errors, and Xcode reported them as such.

The solution is to add one extra argument: -depth . This causes find to do a depth-first traversal of the sub-directories being searched. That is, find will check the contents of directories before acting (eg, running an -exec command) on the directory in question. The default is to act on the directory (in our case, removing it) before attempting to visit it’s contents. So after we removed the directory, find was still trying to look at it; -depth fixes that.

So, the final answer is, I now use:

find . -type d -name .svn -depth -exec rm -fr {} \;

Yes, this is a slightly verbose explanation for something so simple, but maybe it will help someone else.

Resetting Forgotten OS X 10.5 User Password

I have an older G4 Mac Mini I use for testing the Mac app I’m working on (Here, File File F.K.A. Welcome to Your Mac. It’s just nice to have a machine that I can test both 10.4 and 10.5 as well as PowerPC compatibility.

Yesterday I needed to do some updates on the 10.5 system and couldn’t remember my password.

Google was my friend and showed me an Apple Knowledge Base article to solve the problem.

The steps to restart are as follows:

  1. Restart into single user mode (hold Command+S during boot). (Note: that if you use a non-Apple keyboard that’s WindowsKey+S)
  2. At the “#” prompt run:
    • mount -uw /
  3. Now run:
    • launchctl load /System/Library/LaunchDaemons/
  4. Note your short username and user directory by running:
    • ls /Users
  5. Run the following with your username instead of “username”:
    • dscl . -delete /Users/username AuthenticationAuthority
  6. Now reset your password by running:
    • passwd username
  7. Now reboot by running:
    • reboot

This is a bit more complicated than it seems to have been in 10.4 Tiger.  I’m fairly certain you could skip steps 2 – 5, since it didn’t use the same directory service backend.

Note: I don’t use secure file vault, but others on the web have noted that resetting your password in this way will lock you out of your data. In fact, it looks like there is not a way to recover/reset that password, which is part of what makes it secure. 🙂

Thanks Google and Apple!