diff --git a/src/rm/rm.rs b/src/rm/rm.rs index 3dbee442f..087f73b9d 100644 --- a/src/rm/rm.rs +++ b/src/rm/rm.rs @@ -129,7 +129,7 @@ fn remove(files: Vec, force: bool, interactive: InteractiveMode, one_fs: let filename = &filename[..]; let file = Path::new(filename); if file.exists() { - if file.is_dir() { + if file.symlink_metadata().unwrap().is_dir() { if recursive && (filename != "/" || !preserve_root) { if interactive != InteractiveMode::InteractiveAlways { if let Err(e) = fs::remove_dir_all(file) { diff --git a/tests/test_rm.rs b/tests/test_rm.rs index a3cac9dbf..b0083e019 100644 --- a/tests/test_rm.rs +++ b/tests/test_rm.rs @@ -136,3 +136,15 @@ fn test_rm_verbose() { ucmd.arg("-v").arg(file_a).arg(file_b).succeeds() .stdout_only(format!("removed '{}'\nremoved '{}'\n", file_a, file_b)); } + +#[test] +fn test_rm_dir_symlink() { + let (at, mut ucmd) = at_and_ucmd!(); + let dir = "test_rm_dir_symlink_dir"; + let link = "test_rm_dir_symlink_link"; + + at.mkdir(dir); + at.symlink(dir, link); + + ucmd.arg(link).succeeds(); +}