≡ Menu

How to recursively go through all local or remote directories

You can use find command or recursdir command to recurse through local or remote directories to command/find files or create tar files.

recursdir command pass a C script to recursively perform operations on files. recursdir is an excellent tool for automatic stuff. It provides C style programming functions and statements such as:

  • strncmp()
  • exec()
  • system()
  • strstr()
  • strcat()
  • printf()
  • popen()
  • if ( expr ) { take-action }
  • if ( expr ) { take-action } else { do-something-else; }
  • /* comments */
  • Detecting file types and macros
  • All of the logical, arithmetic and bitwise C operators are supported. These are ( ) >= <= > < != == && || ! - + * / % & ^ and have the same meanings and precedences as in C. etc.

Install recursdir

recursdir is part of mirrordir package:
$ sudo apt-get install mirrordir

Recursively find file and take action

For example find out all *.bak file and delete them, using find command:
find /path/to/dir -iname "*bak" -exec rm {} \;
Following is a fast and overkill equivalent of find, using recursdir :
recursdir /path/to/dir -C 'exec("/bin/rm","-f",PATH);'

Find and print out all the *.CPP (C++) files on your system, enter (note usage of if and printf() C like syntax):
recursdir /path/to/dir -C 'if (!glob ("*.cpp", FILE)) printf ("%s\n", PATH);'
find /path/to/dir -iname "*.cpp"

Backup a remote ftp site to local tape:

This is my favorite command to mirror remote ftp tree:
recursdir ftp://user-name@ftp.server.nixcraft.in/ --tar-file /dev/mt

Write complex directory manipulation scripts

You can write complex scripts using recursdir. For example, following will removes all core files from your Linux 32 bit system:

recursdir / -C '
              long l;
              /* look for /proc */
              if (strncmp (PATH, "/proc", 5)) {
                  if (S_ISREG (stat.st_mode) && !strcmp ("core", FILE)) {
                      if (strstr (popen ("file " + PATH), "ELF 32-bit LSB core")) {
                          l = l + stat.st_size;
                          printf ("removing: %s, cumu. total = %ldkB\n", PATH, l >> 10);
                          exec ("rm", "-f", PATH);

recursdir offers many more advanced options such as encryption, backups compression and many more, please refer the man page for more information.

Share this on: