-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
。
既然如此,那-f
flag的目的是什么?它为什么存在?
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 手册中也提到了这一点。
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)
当然,一个有意义的函数/脚本会做更多的事情(例如记录操作)。