如何在 bash 脚本中复制多个文件

如何在 bash 脚本中复制多个文件

我想知道如何在 bash 脚本中复制或 shell 复制多个文件。我的意思是

cp /path/to/source/{file1,file2,file3} /path/to/dest

scp /path/to/source/{file1,file2,file3} user@host:/path/to/dest

会工作得很好,但作为例子

#!/bin/sh
scp /path/to/source/{file1,file2,file3} user@host:/path/to/dest

会抛出这样的错误:

/path/to/source/{file1,file2,file3}: No such file or directory

如果您要复制或 shell 复制单个文件,它就可以工作,所以问题是多个文件。如果我要用于*所有文件但我不想复制所有文件,它也可以工作。我应该只复制选定的文件,因为两个文件夹中都有同名的文件,但内容不同。因此,复制所有文件然后删除不需要的文件是行不通的。

为了更好地理解以下内容:

#!/bin/sh
scp /path/to/source/file1 user@host:/path/to/dest

还如下:

#!/bin/sh
scp /path/to/source/* user@host:/path/to/dest

因此,这与正确使用{ ... }多个文件有关,这些文件将在终端内运行,但如果我在其中运行 bash 脚本则不行。

提前致谢。

//编辑:

如果我尝试使用 cp,我会添加错误:

cp: cannot stat '/path/to/source/{file1,file2,file3}': No such file or directory

答案1

您的脚本中有#!/bin/sh这意味着它将由 运行sh,而不是bash。在许多 Debian 衍生系统上,例如 Ubuntu,/bin/sh是基本 POSIX shell 的符号链接dash。您正在使用的大括号扩展不受以下支持dash

$ dash
$ echo {foo,bar}
{foo,bar}

这意味着该命令cp /path/to/source/{file1,file2,file3} /path/to/dest正在查找名为{file1,file2,file3}.简单的解决方案是使用bash替代。只要将你的 shebang 线从 改为#!/bin/sh#!/bin/bash可以了。

相关内容