ftp'put file * .txt'的行为 - 仅上传第一个匹配的文件

时间:2016-12-29 08:49:01

标签: linux ftp

假设工作目录中有两个文件:

test201612290900.txt
test201612290901.txt

当我跑步时

ftp -n $HOST <<SCRIPT
user $USER $PASSWORD
put test*.txt test.txt
bye
SCRIPT

使用ftp可执行文件(linux),只有一个文件被放到ftp站点。

编辑:我使用此*因为我现在没有提前确切的文件名。

我发现它始终是第一个匹配(test201612290900.txt)被复制到ftp站点。

我的问题:这是记录在案的行为吗?并且,我可以控制这种行为吗?

3 个答案:

答案 0 :(得分:1)

put命令仅上传单个文件。

put命令中的模式实际上是在执行ftp之前由shell解析的(类似于$HOST等环境变量)。

所以这可以回答你的问题:
Does bash's * match files in alphanumeric order?

虽然注意语法put a b c是错误的。它甚至令人惊讶,它不会出错。所以你不能指望它被记录下来。

你最好做点什么:

FILES=(test*.txt)
FILE=${FILES[0]}

ftp -n $HOST <<SCRIPT
user $USER $PASSWORD
put $FILE test.txt
bye
SCRIPT

致谢:How can I get the first match from wildcard expansion?

答案 1 :(得分:1)

您正在使用此处文档而不引用。这意味着在ftp甚至运行之前,shell将扩展通配符并在here文档中插入变量。

所以在实践中,你正在发送

put test201612290900.txt test201612290901.txt test.txt

引用here文档解决了这个问题,当然,这不会使你的程序工作,因为FTP put命令不支持通配符。正如Ipor Sircer的回答所示,mput命令确实如此;但同样,你也需要在这里找到适当的引文。

答案 2 :(得分:0)

今天查看ftp的联机帮助页面是免费的!

 mput local-files
             Expand wild cards in the list of local files given as argu‐
             ments and do a put for each file in the resulting list.  See
             glob for details of filename expansion.  Resulting file names
             will then be processed according to ntrans and nmap settings.