cp 命令在 azure devops 构建管道中的 Bash 脚本中不起作用

cp command not working in Bash Script in build pipeline of azure devops

我需要将包含多个文件的文件夹复制到构建管道中的另一个文件夹。

我用

cp -R -v pathToSourceFolder pathToDestFolder

cp -R -v   /Users/runner/runners/2.166.4/work/1/s/en.lproj/  /Users/runner/runners/2.166.4/work/1/s/platforms/ios/AppName/Resources

我收到退出代码 126 的错误:

usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvXc] source_file ... target_directory

我是 linux/macOS uses/cmd 的新手,谁能帮忙解决这个问题? 注意:macOS 上的管道 运行。

I need to copy the folder with multiple files to another folder in build pipeline.

1.I 假设 /Users/runner/runners/2.166.4/work/1/s 是您构建的默认工作文件夹。所以请避免对路径进行硬编码,而是可以使用 $(System.DefaultWorkingDirectory) 代表该路径。请参阅 Azure Devops predefined variables

2.Since你本来的目的是复制Azure Devops pipeline中的文件,不用太在意不同OS系统中对应的复制语法(Linux,MacOS 或 Windows)。

使用官方Copy Files task,您可以轻松做您想做的事。此任务需要三个输入:Source folderTarget folderContents 我们要复制,仅此而已。

经典UI格式:

您可以通过Browse Source Folder选项选择源文件夹。然后使用 ** 作为目录,$(System.DefaultWorkingDirectory)/platforms/ios/Fixi/Resources 作为目标文件夹。

yaml格式:

- task: CopyFiles@2
  displayName: 'My Copy Task'
  inputs:
    SourceFolder: en.lproj
    TargetFolder: '$(System.DefaultWorkingDirectory)/platforms/ios/Fixi/Resources'

我们已经为您完成了后面的逻辑,以便您可以轻松地在MacOS/Linux/Windows中使用此任务。我的测试日志:

因为在 cp 命令中显然没有任何错误,我会写一些关于目录存在的安全检查:

# Define directories involved
from="pathToSourceFolder"
to="pathToDestFolder"

# Check existence
if [[ -d "$from" ]]
then
  # If the destination directory does not exist, we create it.
  [[ -d $to ]] || mkdir -p "$to"
  if [[ -d $to ]]
  then
    cp -R -v "$from" "$to"
  else
    # If we get here, we will likely have permission problems.
    echo Can not create directory $to
    ls -ld "$to"
  fi
else
  echo Source directory $from does not exist
fi

我知道接受的答案说“cp”命令没有损坏,但它实际上在 azure 管道中。 Microsoft 似乎默认在末尾附加一个“/”,这破坏了命令的行为。

如果你这样做:

cp -r ./src ./dest

它将文件从 src 文件夹复制到 dest 文件夹。

如果你写:

cp -r ./src ./dest/

它将 src 文件夹复制到目标文件夹中,留下 /dest/src/*

此外,当我尝试复制文件时我的构建管道失败了

cp ./src/myfile.txt ./dest/myfile.txt

在末尾添加“/”将导致它失败,因为它试图将文件转储到一个不存在的目录中,因为实际运行的命令如下。

cp ./src/myfile.txt ./dest/myfile.txt/