我曾多次使用cp
或mv
使用通配符,但忘记指定目标目录。以下是收集日志时出现错误的示例:
~# mkdir problem_logs
~# cd problem_logs
~/problem_logs# cp -pv /var/log/messages*
'/var/log/messages' -> '/var/log/messages.1'
您可以看到我忘记写入.
目标目录,并且因为/var/log/messages*
完全扩展为两个文件名,所以第二个文件名被第一个文件覆盖。
~# echo cp -pv /var/log/messages*
cp -pv /var/log/messages /var/log/messages.1
有什么好的措施来预防此类灾害呢?
- 当然不使用该
root
帐户是一个很好的措施(但它只能防止一些错误)。不幸的是,有多个(商业)基于 Linux 的平台,其中许多基本操作都需要root
特权,并且默认情况下用户的 UID 为 0。这些平台通常需要非标准修改才能使用非 root 用户和sudo
. - 学习使用该选项
-i
(--interactive
) 需要确认每次覆盖。 - 学习使用 GNU
-n
(--no-clobber
) 选项可防止所有覆盖。 - 学习使用 GNU 语法,使用选项指定目标目录
-t
(--target-directory
)。示例:cp -pvt. /var/log/messages*
我发现我仍然会忘记写.
最后两个选项有一个缺点,即它们在 POSIX 中没有标准化。它们是 GNU 扩展。
- 还有哪些其他可能性需要考虑?(包括例如替代外壳)
- 它们的优点和缺点是什么?(包括已经列出的可能性)
这个问题当然不是在征求个人意见。它要求的是可能性及其相关的客观属性。
答案1
唯一简单的[1]答案(恕我直言)是创建一个 shell 函数。
就像是:
cy() { cp -i "$@"; }
使用新名称(cy
[2])将确保如果解决方案尚未安装在某些系统中,则不会执行任何操作。而且,该解决方案可以在任何系统上运行。它甚至可以在使用之前测试系统中是否存在某个版本的实用程序,或者只是引发错误/警告。
然后,可以使用您列出的所有/任何解决方案。
[1]不对可能的解决方案或来源(GNU)做出预先判断(或只是给出意见)。
[2]选择一个名称cy
,co
(FWIW,co
是 RCS 校验命令)或其他对您作为用户有意义并且在将要使用它的系统中发生冲突的可能性最小的其他内容。