35

我要复制:

  • 此文件夹:( ajax) /home/thej/public_html/JC/ajax
  • 进入这个文件夹:/home/thej/public_html/demo/conf/. 最终结果将是 /home/thej/public_html/demo/conf/ajax

我知道cp命令应该是这样的:

cp -r /home/thej/public_html/JC/ajax /home/thej/public_html/demo/conf

我的问题是:

  1. 我应该放在/后面ajaxajax/

  2. 我应该放在/后面confconf/

我在网上搜索,有些放'/',有些没有,所以真的很困惑。

4

2 回答 2

54

源目录上没有斜杠

不应该在源目录上放置斜杠:

这一点与cp-但也与mv更重要的地方有关。

我将引用手册中的警告 - 请注意,它不在手册页中,而是在信息页面中info coreutils 'mv invocation'

警告:避免使用尾部斜杠指定源名称,因为它可能是目录的符号链接。否则,'mv' 可能会做一些非常令人惊讶的事情,因为它的行为取决于底层的 rename 系统调用。在具有现代基于 Linux 的内核的系统上,它会因“errno=ENOTDIR”而失败。但是,在其他系统(至少 FreeBSD 6.1 和 Solaris 10)上,它不会默默地重命名符号链接,而是重命名符号链接引用的目录。

在目标目录上使用斜杠

如果要将文件和目录移动到目录中,则应在目标目录中添加尾部斜杠。
只要一切顺利,它不会改变任何事情。
但它可以帮助您避免导致数据丢失或更改的常见错误:

如果将文件移动到目录中,有两件事可能会出错:
您可能拼错了目标目录名称的最后一个组成部分,例如一个错误的字符。可能发生的两件事是这两种情况:

  • 如果拼写错误的名称存在:

    • 该文件将被重命名为拼写错误的名称

    • 它被移动到预期目的地的父目录

    • 所以它最终既不是它,也不是你期望它去的地方。

  • 如果拼写错误的名称确实存在,并且是一个文件:

    • 该文件将覆盖目标父目录中名称拼写错误的文件。

    • 再一次,你不会发现它曾经是或应该在哪里:它只是消失了。

如果您在目标目录上使用斜杠,则两种情况都会被阻止:

mv不会像通常那样使用它作为文件名。相反,mv只是给出一个错误:

mv: failed to access ‘foo/’: Not a directory

自动删除斜线

有一个特殊的选项可以通过从 src 目录中剥离斜线来降低风险cpmv

Some GNU programs (at least `cp' and `mv') allow you to remove any
trailing slashes from each SOURCE argument before operating on it.  The
`--strip-trailing-slashes' option enables this behavior.

   This is useful when a SOURCE argument may have a trailing slash and
specify a symbolic link to a directory.  This scenario is in fact rather
common because some shells can automatically append a trailing slash
when performing file name completion on such symbolic links.  Without
this option, `mv', for example, (via the system's rename function) must
interpret a trailing slash as a request to dereference the symbolic link
and so must rename the indirectly referenced _directory_ and not the
symbolic link.  Although it may seem surprising that such behavior be
the default, it is required by POSIX and is consistent with other parts
of that standard.
于 2014-07-24T05:29:29.537 回答
8

我尝试/在目标上添加尾随。

如果我犯了错误并且源和目标都是文件而不是目录,则添加/意味着我会出错;没有/它,它将破坏目标文件。

(制表符完成通常会添加尾随/,因此添加它通常比不添加它更容易。)

有关更多详细信息,请参阅Volker Siegel 的答案

于 2013-08-10T03:08:22.190 回答