-f --force Do not prompt the user before removing a destination file.
然而,这似乎已经是 的默认行为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
该标志的意图似乎不太可能-f
是覆盖alias mv="mv -i"
,因为有几种标准方式覆盖别名(例如使用\mv
)可以更简洁地执行此操作,并且以跨命令一致的方式执行此操作。
该手册指出,“如果您指定多个 -i、-f、-n 选项,则只有最后一个选项生效”,但该-f
标志的意图似乎仍然不太可能是-i
一般情况下覆盖该标志,因为只需使用即可实现等效行为mv
,这比使用更加简洁和易于理解mv -if
。
既然如此,那么-f
国旗的用途是什么呢?它为何存在?
答案1
的用法-f
更清楚地描述在手册页从 4BSD 开始,添加了-f
和-i
选项:
如果文件2已经存在,之前已删除文件1被感动了。如果文件2有一个禁止写入的模式,mv 打印该模式并读取标准输入以获取一行;如果该行以 y 开头,则移动发生;如果没有,mv 退出。
选项:
-i
代表交互模式。每当移动要取代现有文件时,系统都会提示用户文件名,后跟问号。如果他回答以“y”开头的行,则移动继续。任何其他答复都会阻止移动发生。
-f
代表力量。此选项会覆盖任何模式限制或-i
开关。
mv 如何运行的更精确的定义在POSIX标准,它补充说,仅当它稍后出现在命令行中时-f
才会覆盖。-i
所以默认行为与-f
.默认情况下,仅当目标不可写时才要求确认。 (这种行为至少可以追溯到V4,其中mv
没有采取任何选项。)如果-i
给出了选项,只要目标存在,mv 就会额外要求确认。该-f
选项将禁止在这两种情况下询问(如果它发生在任何之后-i
)。
答案2
当将执行设置mv
为合理的默认值时,它很有用:
alias mv="mv -i"
当你想要强制移动时,这将起作用:
mv -f
因为它是扩展命令中的最后一个选项:
mv -i -f
这一点在文中也提到了GNU Coreutils 手册。
答案3
它的存在是因为(man mv
)
-i
如果指定、-f
、中的多个-n
,则仅最后一个生效。
因此,您可以有一个始终询问的脚本/别名/函数,但您仍然可以覆盖该选项。
# alias
alias mv='mv -i'
# function
MV () { mv -i "$@" ; }
# script
#!/bin/bash
mv -i "$@"
当然,有意义的函数/脚本会做更多事情(例如记录操作)。
答案4
在 shell 编程中,使用 -f 是一种常见的习惯用法,用于确保命令不会因错误而中止或在运行某些命令时要求脚本/用户进行交互式响应。您最不想看到的就是脚本暂停等待用户输入,或者更糟糕的是,错误的命令从标准输入中获取输入。
笔记:撤消别名可能会导致/消除副作用。如果您已将该命令别名为另一个版本或使用其他选项,则撤消别名将导致不必要的副作用。例如,您可能使用 mv 和 rm 进行别名设置以使用回收罐(或其他保护/跟踪系统)。撤销别名会破坏这个......