Bash:为什么输入'cp hey foo*'时,文件会被复制到最后一个目录?

Bash: Why a file will be copied into the last directory when typed 'cp hey foo*'?

结构如下

james/
    hey /foo1 /foo2 /foo3

键入此命令时

cp hey foo*

我收到以下通知

cp: omitting directory 'foo1'
cp: omitting directory 'foo2'

并且文件 hey 被复制到 foo3 目录中。

为什么会这样? 为什么被复制到foo3目录下,为什么foo1foo2 ?

当你这样做时:

cp hey foo*

bash 扩展 参数。在您的情况下,命令行扩展为

cp hey foo1 foo2 foo3

最后一个参数是目标 file/directory。 cp 拒绝复制目录,除非设置了 -R/-r 选项,因此会出现消息。

并且 hey 文件被复制到 foo3

cp 或任何其他命令无法区分带有 * 的命令行和带有扩展参数的命令行,例如与 Windows cmd 不同。

如果您成功将实际的 * 字符传递给 cp(例如:cp foo\* bar),那么 cp 将检查名为 foo* 的文件。命令中没有通配符机制扩展(Windows 端口中有一些,但那是另一回事)

注意:这不是应该使用的方式:

  • 如果您知道只有目录带有 foo 前缀,这可能是一种在不知道目录名称的情况下复制文件的方法。
  • 更经典的用法:cp *.txt foo

注2:危险情况:如果你有file1file2,你想把它们复制到foo,你输入cp file*,省略[=24] =](或误击RETURN),它将复制file1overfile2(在不扩展通配符的shell中发生)。

在你的情况下,如果你想将 hey 复制到所有 foo* 目录,你必须进行循环:

for target in foo*
do
   cp hey "$target"
done