bash 到 运行 lftp 的脚本 ftp 路径

bash script to run lftp with ftp path

我正在尝试编写一个 bash alias/function,它采用 ftp 路径和 运行s lftppget文件。

给定一个远程路径,空格编码为 %20,例如:

sftp://ftp.example.com/Some%20Folder/BigFile.mov

我有这个片段来清理 URL 的 %20 和服务器部分:

echo | sed 's/%20/ /g' | sed 's/sftp:\/\/ftp.example.com//g';

这给了我

/Some Folder/BigFile.mov

现在我需要 运行 通过 lftp 像这样:

lftp sftp://ftp.example.com -u user,pass -e "pget -cn10 '/Some Folder/BigFile.mov'"

我想为这个命令创建一个别名,我们称之为lget,这样我就可以使用原来的URL:

lget "sftp://ftp.example.com/Some%20Folder/BigFile.mov"

这里的解决方案应该是这样的

alias lget='function _lget(){ lftp ... };_lget'

但是我完全不知道如何在函数中包含参数,如何通过 sed 处理它,以及如何处理嵌套的引号。

我可能需要一些反引号...

是这样的吗?

lget () {
    local filename=${1#sftp://ftp.example.com}
    lftp sftp://ftp.example.com -u user,pass -e "pget -cn10 '${filename//%20/ }'"
}

我不明白您为什么要创建一个名称无用的函数,只是为了能够将有用的名称分配给一个简单地调用该函数的别名(尽管这在某些圈子中似乎是常态,出于我不知道的原因)。

您不需要 sed,因为 Bash 包含用于字符串替换的内置函数。如果您需要将其移植到缺少 ${variable//global/replacement} 功能(和 local 关键字)的 POSIX shell,请注意 properly quote 您的字符串传递给 sed。 (在 POSIX shell 中可用 ${variable#prefix} 语法来检索删除前缀的变量的值。哦,为了记录,单个 sed 脚本可以执行多次替换;sed -e 's/foo/bar/' -e 's/baz/quux/g'.)