find: Cleaning Up

 
 9.3 Cleaning Up
 ===============
 
 This section gives examples of removing unwanted files in various
 situations.  Here is a command to remove the CVS backup files created
 when an update requires a merge:
 
      find . -name '.#*' -print0 | xargs -0r rm -f
 
    If your 'find' command removes directories, you may find that you get
 a spurious error message when 'find' tries to recurse into a directory
 that has now been removed.  Using the '-depth' option will normally
 resolve this problem.
 
    It is also possible to use the '-delete' action:
 
      find . -depth -name '.#*' -delete
 
    You can run this command to clean out your clutter in '/tmp'.  You
 might place it in the file your shell runs when you log out
 ('.bash_logout', '.logout', or '.zlogout', depending on which shell you
 use).
 
      find /tmp -depth -user "$LOGNAME" -type f -delete
 
    To remove old Emacs backup and auto-save files, you can use a command
 like the following.  It is especially important in this case to use
 null-terminated file names because Emacs packages like the VM mailer
 often create temporary file names with spaces in them, like '#reply to
 David J. MacKenzie<1>#'.
 
      find ~ \( -name '*~' -o -name '#*#' \) -print0 |
        xargs --no-run-if-empty --null rm -vf
 
    Removing old files from '/tmp' is commonly done from 'cron':
 
      find /tmp /var/tmp -depth -not        -type d -mtime +3 -delete
      find /tmp /var/tmp -depth -mindepth 1 -type d -empty    -delete
 
    The second 'find' command above cleans out empty directories
 depth-first ('-delete' implies '-depth' anyway), hoping that the parents
 become empty and can be removed too.  It uses '-mindepth' to avoid
 removing '/tmp' itself if it becomes totally empty.
 
    Lastly, an example of a program that almost certainly does not do
 what the user intended:
 
      find dirname -delete -name quux
 
    If the user hoped to delete only files named 'quux' they will get an
 unpleasant surprise; this command will attempt to delete everything at
 or below the starting point 'dirname'.  This is because 'find' evaluates
 the items on the command line as an expression.  The 'find' program will
 normally execute an action if the preceding action succeeds.  Here,
 there is no action or test before the '-delete' so it will always be
 executed.  The '-name quux' test will be performed for files we
 successfully deleted, but that test has no effect since '-delete' also
 disables the default '-print' operation.  So the above example will
 probably delete a lot of files the user didn't want to delete.
 
    This command is also likely to do something you did not intend:
      find dirname -path dirname/foo -prune -o -delete
 
    Because '-delete' turns on '-depth', the '-prune' action has no
 effect and files in 'dirname/foo' will be deleted too.