假设我们在一个空白目录中。然后,执行以下命令:
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。
我知道还有其他方法可以解决这个问题,但我希望能够将wcstdin 解释为文件名或文件名列表。例如,
ls JP*/std* | wc
Run Code Online (Sandbox Code Playgroud)
将与
wc JP*/std*
Run Code Online (Sandbox Code Playgroud)
我猜想调整这种行为是不可能的,但我正在编写一个脚本,这会让我的生活变得更轻松。谢谢。