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

use*_*818 15 unix linux 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/

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

Vol*_*gel 30

源目录上没有斜杠

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

问题的关键是有关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
Run Code Online (Sandbox Code Playgroud)

自动删除斜杠

有一个特殊的选择,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.
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 5

我尝试/在目标上拖尾。

如果我犯了一个错误,并且源和目标都是文件而不是目录,则添加/将导致错误的方法。没有/它会破坏目标文件。

(制表符补全通常会添加尾随/,因此添加它通常要比不容易。)

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