当默认行为已经覆盖文件时, mv -f 有什么意义?

42 history files mv

用于GNU Coreutils的手册mv说:

-f --force Do not prompt the user before removing a destination file.
Run Code Online (Sandbox Code Playgroud)

但是,这似乎已经是 的默认行为mv,因此该-f选项似乎是多余的。例如在 GNU Bash 版本 4.3.11 中:

$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2
Run Code Online (Sandbox Code Playgroud)

-f标志的意图似乎不太可能是 override alias mv="mv -i",因为有几种覆盖别名的标准方法(例如 using \mv),它们可以更简洁地以跨命令一致的方式执行此操作。

该手册指出,“如果您指定了多个 -i、-f、-n 选项,则只有最后一个生效”,但该-f标志的意图似乎仍然不太可能是-i一般地覆盖该标志,因为可以通过简单的 using 来实现等效的行为mv,这比 using 更简洁易懂mv -if

既然如此,那-fflag的目的是什么?它为什么存在?

Mar*_*ick 45

的使用-f在更明确说明手册页从4BSD,这是在-f-i添加选项:

如果file2已存在,则在移动file1之前将其删除。如果file2有禁止写入的模式,则 mv 打印模式并读取标准输入以获得一行;如果行以 y 开头,则移动发生;如果没有, mv 退出。

选项:

-i代表交互模式。每当移动要取代现有文件时,用户都会收到文件名后跟一个问号的提示。如果他以“y”开头的行回答,则移动继续。任何其他回复都会阻止移动发生。

-f代表力量。此选项会覆盖任何模式限制或-i开关。

POSIX 标准中给出了更精确的 mv 操作定义,它补充说,-f只有-i在命令行稍后出现时才会覆盖。

所以默认行为与-f. 默认设置是仅在目标不可写时才要求确认。(这种行为至少可以追溯到V4,在那里mv没有采取任何选项。)如果-i给出了选项, mv 会在目标存在时另外要求确认。该-f选项将禁止在这两种情况下询问(如果它发生在 any 之后-i)。


Ale*_*der 15

将 的执行设置mv为合理的默认值时很有用:

alias mv="mv -i"
Run Code Online (Sandbox Code Playgroud)

当您想要强制移动时,这将起作用:

mv -f
Run Code Online (Sandbox Code Playgroud)

因为它是扩展命令中的最后一个选项:

mv -i -f
Run Code Online (Sandbox Code Playgroud)

GNU Coreutils 手册中也提到了这一点。

  • 我反对将 `mv(1)`(和其他 Unix 命令)的默认行为称为“按照你的要求去做,没有愚蠢的问题”,正如你所暗示的那样“疯狂”...... (12认同)
  • 谢谢,但由于我现在添加到问题中的原因,覆盖 `alias mv="mv -i"` 似乎不太可能是 `-f` 存在的原因。 (2认同)

cho*_*oba 11

它的存在是因为 ( man mv)

如果指定-i, -f, 中的多个-n,则只有最后一个生效。

因此,您可以拥有一个始终询问的脚本/别名/函数,但您仍然可以覆盖该选项。

# alias
alias mv='mv -i'

# function
MV () { mv -i "$@" ; }

# script
#!/bin/bash
mv -i "$@"
Run Code Online (Sandbox Code Playgroud)

当然,一个有意义的函数/脚本会做更多的事情(例如记录操作)。