diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index a4a512d6b..36916aef1 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -315,6 +315,12 @@ pub fn uu_app<'a>() -> App<'a> { .long(options::TARGET_DIRECTORY) .value_name(options::TARGET_DIRECTORY) .takes_value(true) + .validator(|s| { + if Path::new(s).is_dir() { + return Ok(()); + } + Err("must specify a directory") + }) .help("copy all SOURCE arguments into target-directory")) .arg(Arg::new(options::NO_TARGET_DIRECTORY) .short('T') diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 9ee76bb5e..443e67557 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -183,6 +183,16 @@ fn test_cp_arg_no_target_directory() { .stderr_contains("cannot overwrite directory"); } +#[test] +fn test_cp_target_directory_is_file() { + new_ucmd!() + .arg("-t") + .arg(TEST_HOW_ARE_YOU_SOURCE) + .arg(TEST_HELLO_WORLD_SOURCE) + .fails() + .stderr_contains("must specify a directory"); +} + #[test] fn test_cp_arg_interactive() { new_ucmd!()