The can be useful to create checksum of a file without having to change to a directory first if the target is not expected to have the same directory structure as locally.
$ md5sum /etc/fstab cd884f87a3ab7bd4bfa9f79bb1c0f0a6 /etc/fstab $ md5sum -B /etc/fstab cd884f87a3ab7bd4bfa9f79bb1c0f0a6 fstab --- src/md5sum.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/md5sum.c b/src/md5sum.c index 447a005a1137..7366d01397d6 100644 --- a/src/md5sum.c +++ b/src/md5sum.c @@ -160,6 +160,9 @@ static int bsd_reversed = -1; /* line delimiter. */ static unsigned char delim = '\n'; +/* Set to strip directory from filename */ +static unsigned char print_basename = false; + #if HASH_ALGO_BLAKE2 static char const *const algorithm_in_string[] = { @@ -214,6 +217,7 @@ static struct option const long_options[] = { "strict", no_argument, NULL, STRICT_OPTION }, { "tag", no_argument, NULL, TAG_OPTION }, { "zero", no_argument, NULL, 'z' }, + { "basename", no_argument, NULL, 'B' }, { GETOPT_HELP_OPTION_DECL }, { GETOPT_VERSION_OPTION_DECL }, { NULL, 0, NULL, 0 } @@ -237,12 +241,10 @@ Print or check %s (%d-bit) checksums.\n\ emit_stdin_note (); if (O_BINARY) fputs (_("\ -\n\ -b, --binary read in binary mode (default unless reading tty stdin)\n\ "), stdout); else fputs (_("\ -\n\ -b, --binary read in binary mode\n\ "), stdout); @@ -269,6 +271,14 @@ Print or check %s (%d-bit) checksums.\n\ fputs (_("\ -z, --zero end each output line with NUL, not newline,\n\ and disable file name escaping\n\ +"), stdout); + if (O_BINARY) + fputs (_("\ + -B, --basename strip directory from filename\n\ +"), stdout); + else + fputs (_("\ + -B, --basename strip directory from filename\n\ "), stdout); fputs (_("\ \n\ @@ -547,8 +557,13 @@ split_3 (char *s, size_t s_len, /* If ESCAPE is true, then translate each NEWLINE byte to the string, "\\n", and each backslash to "\\\\". */ static void -print_filename (char const *file, bool escape) +print_filename (char const *file, bool basename, bool escape) { + if (basename) + { + file = base_name(file); + } + if (! escape) { fputs (file, stdout); @@ -748,7 +763,7 @@ digest_check (const char *checkfile_name) { if (needs_escape) putchar ('\\'); - print_filename (filename, needs_escape); + print_filename (filename, false, needs_escape); printf (": %s\n", _("FAILED open or read")); } } @@ -783,7 +798,7 @@ digest_check (const char *checkfile_name) { if (needs_escape) putchar ('\\'); - print_filename (filename, needs_escape); + print_filename (filename, false, needs_escape); } if (cnt != digest_bin_bytes) @@ -883,10 +898,10 @@ main (int argc, char **argv) setvbuf (stdout, NULL, _IOLBF, 0); #if HASH_ALGO_BLAKE2 - const char* short_opts = "l:bctwz"; + const char* short_opts = "l:bctwzB"; const char* b2_length_str = ""; #else - const char* short_opts = "bctwz"; + const char* short_opts = "bctwzB"; #endif while ((opt = getopt_long (argc, argv, short_opts, long_options, NULL)) != -1) @@ -941,6 +956,9 @@ main (int argc, char **argv) case 'z': delim = '\0'; break; + case 'B': + print_basename = true; + break; case_GETOPT_HELP_CHAR; case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); default: @@ -1077,7 +1095,7 @@ main (int argc, char **argv) fputs (DIGEST_TYPE_STRING, stdout); #endif fputs (" (", stdout); - print_filename (file, needs_escape); + print_filename (file, print_basename, needs_escape); fputs (") = ", stdout); } @@ -1095,7 +1113,7 @@ main (int argc, char **argv) putchar (file_is_binary ? '*' : ' '); - print_filename (file, needs_escape); + print_filename (file, print_basename, needs_escape); } putchar (delim);