cp -R
与如何执行 bash 命令相比,我只是对 bash 命令的实现感到非常困惑POSIX 单词应该发生什么
鉴于 posix 定义,我希望cp -R srcDir existingDestDir
结果是内容的srcDir
要复制到existingDestDir
.相反,srcDir
在 sh 的 bash 和 csh 实现中都会将其复制到现有的DestDir 中。
posix cp -R 定义的相关部分:
对于每个source_file,应采取以下步骤:
(...)
2、如果source_file是目录类型,则需要执行以下步骤:
(...)
F。应将目录 source_file 中的文件复制到目录 dest_file,执行此处列出的四个步骤(1 到 4),并将文件作为 source_files。
如果有人能为我解决这个问题,我将不胜感激。
答案1
您错过了 POSIX 文档中的进一步段落:
第三种概要形式 (
cp -R [-H|-L|-P] [-fip] source_file... target
) 由指定了 -R 选项的两个或多个操作数表示。 cp 实用程序应将每个 source_file 中的文件层次结构中的每个文件复制到名为如下的目标路径:
- 如果 target 存在并命名现有目录,则文件层次结构中每个文件的相应目标路径的名称应为 target、单个
<slash>
字符(如果 target 不以 结尾<slash>
)和文件相对于该目录的路径名的串联。包含 source_file 的目录。
在你的情况下,与
cp -R srcDir existingDestDir
“source_file”是srcDir
,“target”是existingDestDir
。在该段落中,“文件层次结构中每个文件的目标路径”变为existingDestDir/srcDir
,这解释了您所看到的行为。
答案2
有几点需要明确:
cp
是一个独立的实用程序bash
。有些人可能会对内置命令感到困惑,例如cd
和pwd
它们是或可能是 POSIX shell 的一部分。- POSIX 指的是系列文件由 The Open Group 和 IEEE 共同维护,简称为IEEE 标准 1003.1™。
bash
是实现 POSIX 中描述的功能的几个 shell 之一。大多数 shell 与 POSIX shell 都有一些差异sh
;运行 shell 所使用的名称是 POSIX 中描述的一项功能。- 在该部分2.14.特殊的内置实用程序,POSIX 说
期限“内置”意味着 shell 可以直接执行该实用程序而无需搜索它。实施可以选择使任何内置实用程序;但是,此处描述的特殊内置实用程序在两个方面与常规内置实用程序不同:
所以原则上cp
可以bash
如果其开发者选择这样做的话,就可以成为其中的一部分。在实践中并没有这样做,因为bash
通过添加可以很好地完成的功能来进一步复杂化是没有意义的分别地从bash
。
接下来,问题中提到的链接是基于在 POSIX 上,但不是这POSIX 文档。您可以在最后看到免责声明:
部分 该文本的重印和转载...
和
此页面中出现的任何印刷或格式错误很可能是在将源文件转换为手册页格式期间引入的。
但手册页的大部分内容都是从 POSIX 逐字复制的。 POSIX 文档以准法律风格编写,试图避免详细描述其作者意识到现有实现不同的事物,并避免在他们认为实现内部细节可能不同的地方详细描述。因此,您得到的是程序所采取的操作的逐步描述,并且(通常)省略了其他作者添加的用于解释不同步骤如何相关的细节。一些 POSIX 文档提供了一个章节基本原理,但即使是这些似乎也只是少数。结果通常很模糊,但您必须考虑其意图:描述现有程序的共同特征。
这是问题的特定部分,表明存在困惑:
鉴于 posix 定义,我期望cp -R srcDir 现有目标目录导致内容源目录被复制到现有的目标目录。反而源目录被复制到现有的目标目录在 sh 的 bash 和 csh 实现中。
该文档的要点是目录源中的也使用与以下相同的迭代和递归描述进行处理普通的文件。其中一项规则概述于概要部分:
cp -R [-H|-L|-P] [-fip] source_file... target
这是第三个例子,也是唯一一个提到该-R
选项的例子。这一点在后面会提到描述:
这第三摘要形式由两个或多个指定了 -R 选项的操作数表示。这
cp
实用程序应将每个 source_file 中的文件层次结构中的每个文件复制到名为如下的目标路径:
如果目标存在和名称现有目录,文件层次结构中每个文件对应的目标路径的名称应为以下的串联目标,单个
<slash>
字符,如果目标不以 a 结尾<slash>
,并且文件相对于包含的目录的路径名源文件。如果目标不存在且指定了两个操作数,对应的目标路径名称为源文件应该目标;文件层次结构中所有其他文件的相应目标路径的名称应是以下内容的串联目标、一个
<slash>
字符以及文件相对于的路径名源文件。
也就是说,您的目录名称被视为第一个项目符号项目中的“文件”,并与目标目录的名称连接。
进一步阅读:
- cp——复制文件(索拉里斯)
- cp - 复制文件和目录(GNU coreutils)
GNU coreutils 手册页缺乏详细信息。你可以在 Solaris 手册页中看到 POSIX 文档的一些风格,顺便说一下,它写得更清楚:
/usr/bin/cp -r | -R [-H | -L | -P] [-fip@] source_dir... target
和
在第三种概要形式中,由以下项指定的一个或多个目录源目录复制到target指定的目录下。必须指定
-r
或之一。-R
对于每个源目录,cp
复制所有文件和子目录。