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.