假设我们在一个空白目录中。然后,执行以下命令:
mkdir dir1
cp -r dir1 dir2
Run Code Online (Sandbox Code Playgroud)
生成两个(空白)目录dir1
和dir2
,其中dir2
已创建为dir1
. 但是,如果我们这样做:
mkdir dir1
mkdir dir2
cp -r dir1 dir2
Run Code Online (Sandbox Code Playgroud)
然后我们反而发现dir1
现在已经放到里面了dir2
。这意味着完全相同的cp
命令的行为取决于目标目录是否存在。如果是,则该cp
命令的作用与此相同:
mkdir dir1
mkdir dir2
cp -r dir1 dir2/.
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎非常违反直觉。我原以为cp -r dir1 dir2
(当dir2
已经存在时)会删除现有dir2
(和任何内容)并将其替换为dir1
,因为这是cp
用于两个文件时的行为。我知道递归副本本身有点不同,因为目录在 Linux 中(更广泛地在类 Unix 系统中)存在,但我正在寻找更多关于为什么选择这种行为的解释。如果您能指出一种方法来确保cp
行为符合我的预期(而不必事先测试并删除目标目录),则可以加分。我尝试了一些cp
选择,但没有任何运气。我想我会接受rsync
为了其他不知道该命令的人在这个问题上发生的解决方案。
如果这种行为不普遍,我在 CentOS 上使用 bash。
我知道还有其他方法可以解决这个问题,但我希望能够将wc
stdin 解释为文件名或文件名列表。例如,
ls JP*/std* | wc
Run Code Online (Sandbox Code Playgroud)
将与
wc JP*/std*
Run Code Online (Sandbox Code Playgroud)
我猜想调整这种行为是不可能的,但我正在编写一个脚本,这会让我的生活变得更轻松。谢谢。