如何在bash脚本中scp所有文件(或选择文件)

时间:2018-04-26 02:00:33

标签: bash scp

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

scp * username2@destination_host:directory2/filename2

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

scp $1 $2:$3

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

  

ssh:无法解析主机名main.cpp:名称或服务未知

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

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

1 个答案:

答案 0 :(得分:2)

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

scriptname * user@host directory

它变成了

scriptname file1 file2 file3 file4 user@host directory

然后脚本尝试执行:

scp file1 file2:file3

如果您希望将通配符字面地发送到脚本,则需要引用它:

scriptname "*" user@host directory

当脚本使用变量$1时,通配符将被展开,因为您没有引用它。您应引用所有其他变量,因为您不希望它们进一步扩展:

scp $1 "$2:$3"

另一种选择是更改脚本,以便首先放置固定参数:

scriptname user@host directory filenames

然后脚本可以删除那些固定的参数,并使用"$@"来完成剩下的工作:

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