diff --git a/crates/nu-command/src/filesystem/rm.rs b/crates/nu-command/src/filesystem/rm.rs index 41f48e92d1..486f6acfd5 100644 --- a/crates/nu-command/src/filesystem/rm.rs +++ b/crates/nu-command/src/filesystem/rm.rs @@ -393,7 +393,11 @@ fn rm( trash::delete(&f).map_err(|e: trash::Error| { Error::new(ErrorKind::Other, format!("{e:?}\nTry '--trash' flag")) }) - } else if metadata.is_file() || is_socket || is_fifo { + } else if metadata.is_file() + || is_socket + || is_fifo + || metadata.file_type().is_symlink() + { std::fs::remove_file(&f) } else { std::fs::remove_dir_all(&f) @@ -411,7 +415,11 @@ fn rm( Err(e) } else if interactive && !confirmed { Ok(()) - } else if metadata.is_file() || is_socket || is_fifo { + } else if metadata.is_file() + || is_socket + || is_fifo + || metadata.file_type().is_symlink() + { std::fs::remove_file(&f) } else { std::fs::remove_dir_all(&f) diff --git a/crates/nu-command/tests/commands/rm.rs b/crates/nu-command/tests/commands/rm.rs index 978a803250..ac79561421 100644 --- a/crates/nu-command/tests/commands/rm.rs +++ b/crates/nu-command/tests/commands/rm.rs @@ -352,6 +352,29 @@ fn remove_ignores_ansi() { }); } +#[test] +fn removes_symlink() { + let symlink_target = "symlink_target"; + let symlink = "symlink"; + Playground::setup("rm_test_symlink", |dirs, sandbox| { + sandbox.with_files(vec![EmptyFile(symlink_target)]); + + #[cfg(not(windows))] + std::os::unix::fs::symlink(dirs.test().join(symlink_target), dirs.test().join(symlink)) + .unwrap(); + #[cfg(windows)] + std::os::windows::fs::symlink_file( + dirs.test().join(symlink_target), + dirs.test().join(symlink), + ) + .unwrap(); + + let _ = nu!(cwd: sandbox.cwd(), "rm symlink"); + + assert!(!dirs.test().join(symlink).exists()); + }); +} + struct Cleanup<'a> { dir_to_clean: &'a PathBuf, }