如何在 bash 脚本中对所有文件(或 select 文件)进行 scp

How to scp all files (or select files) in a bash script

我正在尝试编写一个 bash 脚本,我可以使用 scp 将当前目录中的所有文件(或我命名的文件)上传到服务器。以下命令适用于 bash 脚本。

scp * username2@destination_host:directory2/filename2

但是,我试图让我的脚本命名一个文件(最终是几个文件)或上传我服务器中的所有文件、一个服务器和一个目录。为什么在输入 * 作为第一个参数时以下脚本不起作用?

scp  :

当尝试使用当前目录中的 * 上传 C++ 项目时,它告诉我:

ssh: Could not resolve hostname main.cpp: Name or service not known

如果我只指定文件 main.cpp 它工作正常,但对于这种情况,我不想指定每个文件的名称,因为这对于更大的项目可能需要一段时间。

另外,附带说明一下,我如何允许这样的脚本能够指定可变数量的文件并且仍然能够识别我的服务器名称(例如,上传 2 个文件或 5 个文件)我指定而不是使用 *)?

当您使用 * 作为脚本的参数时, shell 会扩展通配符。所以如果你这样做:

scriptname * user@host directory

变成

scriptname file1 file2 file3 file4 user@host directory

那么脚本会尝试做:

scp file1 file2:file3

如果您希望将通配符按字面意思发送到您需要引用的脚本中:

scriptname "*" user@host directory

当脚本使用变量 </code> 时,通配符将被扩展,因为您没有引用它。您应该引用所有其他变量,因为您不希望它们进一步扩展:</p> <pre><code>scp ":"

另一种选择是更改脚本,以便将固定参数放在第一位:

scriptname user@host directory filenames

然后脚本可以删除那些固定参数,并使用"$@"得到其余的:

dest=
dir=
shift 2
scp "$@" "$dest:$dir"