diff --git a/src/uu/mv/locales/en-US.ftl b/src/uu/mv/locales/en-US.ftl index fda4ea2246e..8f2b909286a 100644 --- a/src/uu/mv/locales/en-US.ftl +++ b/src/uu/mv/locales/en-US.ftl @@ -61,6 +61,7 @@ mv-debug-skipped = skipped {$target} # Prompt messages mv-prompt-overwrite = overwrite {$target}? +mv-prompt-overriding-mode = overwrite {$target}, overriding mode {$mode} ({$mode_str})? # Progress messages mv-progress-moving = moving diff --git a/src/uu/mv/locales/fr-FR.ftl b/src/uu/mv/locales/fr-FR.ftl index 2288e95f51a..dd4871bae6c 100644 --- a/src/uu/mv/locales/fr-FR.ftl +++ b/src/uu/mv/locales/fr-FR.ftl @@ -59,6 +59,7 @@ mv-debug-skipped = ignoré {$target} # Messages de confirmation mv-prompt-overwrite = écraser {$target} ? +mv-prompt-overriding-mode = écraser {$target}, en ignorant le mode {$mode} ({$mode_str}) ? # Messages de progression mv-progress-moving = déplacement diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 723875f615f..0ac5caacc1b 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -732,10 +732,44 @@ fn rename( return Ok(()); } OverwriteMode::Interactive => { - if !prompt_yes!( - "{}", - translate!("mv-prompt-overwrite", "target" => to.quote()) - ) { + // We assign 'msg' the result of this block + let msg = { + let default_msg = translate!("mv-prompt-overwrite", "target" => to.quote()); + + #[cfg(unix)] + { + use libc::mode_t; + use std::os::unix::fs::PermissionsExt; + + // We use an 'if let' as an expression here + if let Ok(meta) = fs::metadata(to) { + let mode = meta.permissions().mode() & 0o777; + if (mode & 0o200) == 0 { + let octal_mode = format!("{mode:04o}"); + let mode_string = format!("\u{200c}{octal_mode}"); + + // This is the "return" value of the inner block + translate!( + "mv-prompt-overriding-mode", + "target" => to.quote(), + "mode" => mode_string, + "mode_str" => uucore::fs::display_permissions_unix(mode as mode_t, false) + ) + } else { + default_msg + } + } else { + default_msg + } + } + + #[cfg(not(unix))] + { + default_msg + } + }; + + if !prompt_yes!("{}", msg) { return Err(io::Error::other("")); } }