我可以使用FTP上传整个文件夹吗?


29

我需要使用FTP上传完整的文件夹。是否可以选择一次传输文件夹及其所有内容?

Answers:


24

如果使用的是标准命令行ftp客户端,则该MPUT命令将允许您传输所有与(shell glob样式)模式匹配的文件,因此MPUT *将发送当前目录中的所有文件。还MGET可以检索与模式匹配的文件。

默认情况下,MPUTMGET都会提示您是否先传输每个文件。您可能想要关闭“ PROMPT”命令的提示(无参数;这是一个切换)。


这个问题最初来自stackoverflow,所以我认为它应该是公认的答案。虽然原来提问者似乎已经消失,因此不打算接受一个....
codetaku

警告:Windows随附的FTP命令行客户端不支持被动模式,因此使用此技术可能会浪费您的时间。就我而言,它确实有效,因为我需要上传文件,并且使用的是Windows命令行w /本机安装的工具。
sean2078

1
它将传输当前目录中的所有普通文件,但不会递归地传输存在的任何目录。它只会默默地忽略它们
bergercookie

22

您可以使用ncftpput。请执行下列操作:

  1. 安装ncftp:

    yum install ncftp
    

yum是小写的。

或者:

    apt-get install ncftp

2.执行以下命令:

    ncftpput -R -v -u "ftp-username" ftp.website.com ftp-upload-path local-path/*

Yum应该更改为yum-因为它区分大小写。
olekeh

1
以下是ncftpput的所有CLI选项:ncftp.com/ncftp/doc/ncftpput.html
Pepijn Olivier



2

一个针对像我这样的其他Windows新手的简单教程,在这里出现:

上传整个文件夹(其中包含所有子文件夹和文件)的最简单方法是:

  1. 从此链接下载NcFTP客户端(免费,但您可以捐赠)。
  2. 从列表中选择Microsoft Windows的NcFTP Client 3.2.5
  3. 安装它。
  4. 完成后,将弹出一个带有樱桃图标的CMD小窗口。不用了
  5. 只需打开一个标准CMD窗口并输入:
    ncftpput -u * yourUserNameHere * -p * yourUserPasswordHere * -R * www.yourWebsite.com * /
                     _C:\ yourFolderDirectoryHere \\ * _
    (作为一行)。

注意:

  • -R 是“递归”的标志;它使命令以递归方式复制所有子文件夹
  • / (斜杠)是您网站的根目录
  • C:\yourFolderDirectoryHere\* 选择里面的所有东西 C:\yourFolderDirectoryHere

看起来不错,但是服务器禁止我说自己在短时间内建立了800个连接。没有办法减少连接数。另一个问题是,如果目标文件已经存在,我不知道如何跳过上传。
16851556

2

我将提供一个答案,尽管它纯粹是蛮力的,丝毫也不优雅,但它是在命令行上唯一对我有用的东西。我创建了文件列表,并将其放入脚本中:

生成文件列表:

find my-dir -exec echo "put /Users/username/"{} {}  \;

将它们复制并粘贴到脚本中:

#!/bin/bash

hostname="my-ftp-host"
username="username"
password="password"
ftp -in $hostname <<EOF
quote USER $username
quote PASS $password

binary
cd 123456
{COPY THE LIST HERE}
quit
EOF


0

FileZilla对此非常有用。如果您不想下载/安装任何内容,则可以使用Internet Explorer完成。进入高级选项,然后选择Enable FTP folder view (outside of Internet Explorer)。然后,您可以将资源管理器窗口指向FTP服务器,并在资源管理器窗口之间拖放文件和文件夹。



0

目标目录是一个zip文件。您可以使用以下代码将完整的zip文件复制到ftp服务器中。

//Taking source and target directory path
string sourceDir = FilePath + "Files\\" + dsCustomer.Tables[0].Rows[i][2].ToString() + "\\ConfigurationFile\\" + dsSystems.Tables[0].Rows[j][0].ToString() + "\\XmlFile";

string targetDir = FilePath + "Files\\Customers\\" + CustomerName + "\\" + SystemName + "\\";                                                                                       
foreach (var srcPath in Directory.GetFiles(sourceDir))
{
    //Taking file name which is going to copy from the sourcefile                                              
    string result = System.IO.Path.GetFileName(srcPath);

    //If that filename exists in the target path
    if (File.Exists(targetDir + result))
    {
        //Copy file with a different name(appending "Con_" infront of the original filename)
        System.IO.File.Copy(srcPath, targetDir + "Con_" + result);
    }
    //If not existing filename
    else
    {
        //Just copy. Replace bit is false here. So there is no overwiting.
        File.Copy(srcPath, srcPath.Replace(sourceDir, targetDir), false);
    }
}         

很好,但是您的程序无法编译。
DavidPostill

0

我的答案是@dgig答案的变体。

您可以列出所有文件并将它们(包括put命令)保存到文件中:

find my-dir -exec echo "put /Users/username/"{} {} > list.txt \; 

然后使用sftp处理文件:

sftp -C -b sftpbatchfile.txt name@server

-C用于压缩,-b用于批处理文件


这不会按要求使用FTP。该sftp程序使用SFTP协议,这是一个不同的协议,尽管它有一些共同的字母。而且您没有编辑enter code here剩余部分。
dave_thompson_085
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.