复制文件夹时,我应该在源和目标之后添加尾部斜杠吗?

时间:2013-08-10 02:59:22

标签: linux unix cp

我想将此文件夹: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. 我应该在/ajax之后放置ajax/吗?

  2. 我应该在/conf之后放置conf/吗?

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

2 个答案:

答案 0 :(得分:28)

源目录

上没有斜杠

不应该在源目录上添加一个斜杠:

这一点与cp - 相关,但也与mv 相关,其中更重要

我会引用手册中的警告 - 请注意,在手册页中找不到它,但在信息页info coreutils 'mv invocation'中找不到:

  

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

在目标目录

上使用尾部斜杠

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

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

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

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

    • 它会被移动到目标目的地的父目录

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

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

    • 该文件将覆盖目的地的parend目录中带有拼写错误名称的文件。

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

如果在目标目录上使用尾部斜杠,则会阻止这两种情况:

它使mv在正常情况下不会将其用作文件名。相反,mv只会出错:

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

自动删除斜杠

cpmv有一个特殊选项可以通过从src dirs中删除斜杠来降低风险:

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.

答案 1 :(得分:5)

我尝试在目标上放置一个尾随/

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

(标签完成通常会添加尾随/,因此通常更容易添加它。)

有关详细信息,请参阅Volker Siegel's answer