bash如何使用cp复制文件夹内容到现有文件夹中
在大量的cp问题中,我还没有发现任何关于这种行为差异的信息(已在Ubuntu 18.04上进行了测试)。抱歉丢失帖子,但是设置有点复杂。
情况1:这是预期的行为
给出以下文件夹
source
file1.cpp
file2.cpp
运行此脚本后
#!/bin/bash
cp -r source/ target/
我确实得到了这个结果
source # same as above, plus a copy in "target"
file1.cpp
file2.cpp
target
file1.cpp
file2.cpp
情况2:使用相同的脚本,结果会有所不同!
这里还有一个空的文件夹资源file1.cppfile2.cpp目标
并运行相同的脚本
#!/bin/bash
cp -r source/ target/
给我一个不同的,不希望的结果
source # same as above, plus a copy in "target"
file1.cpp
file2.cpp
target
source
file1.cpp
file2.cpp
Case1和Case2的普通解决方案
cp -r source/ target/ # works only for Case 1
cp -r source/* target/ # works only for Case 2
在错误的情况下使用,一个会导致错误,另一个会产生错误的结果,这可能会非常令人困惑。这意味着对于每个复制操作,我必须检查目标文件夹是否存在并使用其他命令。这非常麻烦,但我不知道有一个更简单的解决方案。
Case2的未解决情况
但是,我的问题是这个:当我使用变量作为源和目标时,我的密码看起来像这样
#!/bin/bash
SOURCE="source"
TARGET="target"
if [ -d "$TARGET" ]; then
cp -r $SOURCE $TARGET
else
cp -r $SOURCE/* $TARGET # note "$SOURCE/*" would fail.
fi
并且我有一个带空格的$ SOURCE路径。
SOURCE =“源代码”
由于我无法对源变量使用引号,因此会导致两个'找不到目录错误'。
我该如何解决Case2?
EDIT:进一步澄清问题。这个
SOURCE =“ source”cp -r“ $ SOURCE / *” $ TARGET
失败,错误为“无法统计'source / ':没有这样的文件或目录”。我认为这意味着bash无法用文件列表替换/,而cp将其作为文件文字获取。显然不存在名称为“ source / *”的文件或文件夹。但是也许我想的太简单了,bash的作用却有所不同。
虽然您的主要问题与cp
命令有关,但是我还是想对您的尝试说些什么。因此,让我们逐步进行吧。
cp
行为cp
命令在目标文件夹包含与源文件夹名称相同的文件夹时的行为有所不同。此行为是预期的,但可以使用根据-T
的man选项避免。
因此,您可以执行:
cp -rT source/ target/
您尝试使用空格处理路径时会提到问题。尽管在以前的解决方案中,您不需要自定义脚本,但我想强调一下,路径中包含空格的变量要求所有访问都必须用双引号引起来。变量内容必须用双引号引起来,而不要用双引号引起来(因为您希望globstar扩展,所以不能从字面上理解)。因此,您以前的脚本应如下所示:
#!/bin/bash
SOURCE=${1:-"source"}
TARGET=${2:-"target"}
if [ -d "$TARGET" ]; then
cp -r "$SOURCE" "$TARGET"
else
cp -r "$SOURCE"/* "$TARGET" # note "$SOURCE/*" would fail.
fi