diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index 458177e8a..36dfbbe1e 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -168,8 +168,13 @@ where } else if filename.is_dir() { Box::new(BufReader::new(io::empty())) as Box } else { - file_buf = - File::open(filename).map_err_context(|| filename.to_str().unwrap().to_string())?; + file_buf = match File::open(filename) { + Ok(file) => file, + Err(err) => { + show!(err.map_err_context(|| filename.to_string_lossy().to_string())); + continue; + } + }; Box::new(file_buf) as Box }); let (sum, sz) = digest_read(&mut options.digest, &mut file, options.output_bits) diff --git a/tests/by-util/test_cksum.rs b/tests/by-util/test_cksum.rs index 80cfc7499..464de9474 100644 --- a/tests/by-util/test_cksum.rs +++ b/tests/by-util/test_cksum.rs @@ -80,6 +80,22 @@ fn test_nonexisting_file() { .stderr_contains(format!("cksum: {file_name}: No such file or directory")); } +#[test] +fn test_one_nonexisting_file() { + let (at, mut ucmd) = at_and_ucmd!(); + + at.touch("abc.txt"); + at.touch("xyz.txt"); + + ucmd.arg("abc.txt") + .arg("asdf.txt") + .arg("xyz.txt") + .fails() + .stdout_contains_line("4294967295 0 xyz.txt") + .stderr_contains("asdf.txt: No such file or directory") + .stdout_contains_line("4294967295 0 abc.txt"); +} + // Make sure crc is correct for files larger than 32 bytes // but <128 bytes (1 fold pclmul) // spell-checker:disable-line #[test]