【问题标题】:Shell Script: Copying files with wildcard (*) to from one folder to another folderShell 脚本:将带有通配符 (*) 的文件从一个文件夹复制到另一个文件夹
【发布时间】:2020-05-04 20:57:37
【问题描述】:

一个非常简单但困扰我的问题。我想将一个文件夹中的所有文件复制到 shell 脚本中的另一个文件夹。像这样:

#!/bin/sh
cp data/* /tmp/data

但是得到了error: zsh:1: no matches found: data/*

阅读有关 * 的各种帖子,例如:Copying files with wildcard (*) to a folder in a bash script - why isn't it working? 我试过了:

cp "data"/* /tmp/data
Error: zsh:1: no matches found: data/*
cp -r data /tmp/data
Error cp: cannot stat `data': No such file or directory

我可以验证数据文件夹是否包含文件,并且我在父目录数据文件夹中。如果我在脚本中执行ls data,它的内容就会正确打印出来。

有人可以帮忙吗?我正在使用 zsh。

【问题讨论】:

  • 运行脚本时当前的工作目录是什么? (也就是说,如果你在调用cp之前调用pwd,输出是什么?
  • 如何运行脚本?我很惊讶您在第 1 行收到关于 data/* 的 zsh 错误,而这是 sh 脚本,其中第 1 行是注释。
  • @chepner 当前目录是数据的父目录。就像我说的,如果我在脚本中的 cp 命令之后添加ls data,它将正确打印文件夹内容。
  • @thatotherguy 实际上有一个包装外壳脚本来运行子脚本中的多个命令,它分别运行每个命令。整套工作正常,但最近cp 在迁移到新机器后坏了。我可以对数据文件夹执行ls,但cp 不起作用。
  • 数据文件夹是如何创建的?我正在描绘这样的场景:您有一个带有 DOS 行结尾的脚本,该脚本执行了一个类似 mkdir data 的命令,这导致创建了一个名为 data\r 的目录(\r 代表一个回车符)。您的cp 命令失败,因为目录名称是data\r,而不是data,但ls data 成功的原因与mkdir data 创建错误目录名称的原因相同:data 是该行的最后一个参数。

标签: shell zsh


【解决方案1】:

我认为您要查找的命令可能是cp -r data /tmp/。它将在/tmp/ 中创建data 目录。

【讨论】:

  • 是的,我同意目的地修复。但是这里的问题是命令根本无法识别'data'文件夹。
  • cp 实用程序的历史版本有一个 -r 选项。此实现支持该选项;但是,强烈建议不要使用它,因为它不能正确复制特殊文件、符号链接或 fifo。
  • @ruyuan 这可能是因为 shell 抱怨的“数据”目录是 /tmp/data 目录,因为它还不存在,或者您正在运行的工作目录命令 from 与“data”不在同一目录中,您必须在其中提供完整路径,或者在复制之前先更改目录。
【解决方案2】:
$ cp "data/*" /tmp/data

它对我有用。

【讨论】: