Capturing File Metadata for Recovery

Problem

You want to create a list of files and details about them for archive purposes, for example, to verify backups, re-create directories, etc. Or maybe you are about to do a large chmod -R and need a back-out plan. Or perhaps you keep /etc/* in a revision control system that does not preserve permissions or ownership.

Solution

Use GNU find with some printf formats:

#!/usr/bin/env bash
# cookbook filename: archive_meta-data

printf "%b" "Mode\tUser\tGroup\tBytes\tModified\tFileSpec\n" > archive_file
find / \( -path /proc -o -path /mnt -o -path /tmp -o -path /var/tmp \
  -o -path /var/cache -o -path /var/spool \) -prune \
  -o -type d -printf 'd%m\t%u\t%g\t%s\t%t\t%p/\n' \
  -o -type l -printf 'l%m\t%u\t%g\t%s\t%t\t%p -> %l\n' \
  -o         -printf '%m\t%u\t%g\t%s\t%t\t%p\n' >> archive_file

Warning

Note that the -printf expression is in the GNU version of find.

Discussion

The (-path /foo-o -path…) -prune part removes various directories you probably don’t want to bother with, e.g., -type d is for directories. The printf format is prefixed with a d, then uses an octal mode, user, group, and so forth. -type 1 is for symbolic links and also shows you where the link points. With the contents of this file and some additional scripting, you can determine at a high level if anything has changed, or re-create mangled ownership or permissions. Note that this does not take the place of more security-oriented programs like Tripwire, AIDE, Osiris, or Samhain.

See Also

  • man find ...

Get bash Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.