bash脚本:如何应对不同的cp行为?

问题描述 投票:0回答:1

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的作用却有所不同。

linux bash cp
1个回答
0
投票

虽然您的主要问题与cp命令有关,但是我还是想对您的尝试说些什么。因此,让我们逐步进行吧。

问题1:cp行为

cp命令在目标文件夹包含与源文件夹名称相同的文件夹时的行为有所不同。此行为是预期的,但可以使用根据-Tman选项避免。

因此,您可以执行:

cp -rT source/ target/

问题2:包含空格的路径

您尝试使用空格处理路径时会提到问题。尽管在以前的解决方案中,您不需要自定义脚本,但我想强调一下,路径中包含空格的变量要求所有访问都必须用双引号引起来。变量内容必须用双引号引起来,而不要用双引号引起来(因为您希望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
© www.soinside.com 2019 - 2024. All rights reserved.