使用 FTP(唯一选项)在 linux 中使用单行命令同步目录中的文件

Posted

技术标签:

【中文标题】使用 FTP(唯一选项)在 linux 中使用单行命令同步目录中的文件【英文标题】:use FTP (only option) to sync files in a directory with a single line command in linux 【发布时间】:2021-11-17 22:36:45 【问题描述】:

我需要将我计算机中的文件与我只有 FTP 访问权限的服务器同步,我希望在 crontab 中添加一行,每天检查新文件或更新文件是否被传输(覆盖)。

这个问题在几年前就被问过了,但没有简单的答案,我想知道今天是否有比ncftputwput 等不允许的更好的解决方案

ncftpput -R -z -u "USER" -p "PASS" webxx.at /dir/ /source/

据传可以工作,但-z 开关似乎是“标签”使用的。我的实验似乎表明检查时间不可靠。

【问题讨论】:

【参考方案1】:

只需将此代码放入文件 FtpSync.sh 并将此文件添加到您的 crontab 中。 您可以调整文件中的参数。我试图创建“说话”参数,以便他们解释自己。 调用此脚本将下载或上传文件(取决于参数CopyServerdataToLocal)。如果你想两者都做,只需使用不同的参数启动脚本两次(或创建两个脚本文件)。

FtpSync.sh

#!/bin/bash
# Michael Hutter, 20.11.2021
# This Script can be used to synchronize a remote FTP directory and a local directory
HOST='ftp.mywebspace.de'
USER='web1234567f1'
PASS='YourSecretPwd'
SERVERFOLDER='/FolderOnWebspace'
PCFOLDER='/home/michael/ftpsync/MyLocalFolder'
CopyMoreThanOneFileSimultaneously="--parallel=10"

CopyServerdataToLocal=1 # 0=Upload, 1=Download
IgnoreSubdirectories=1
ContinuePartiallyTransmittedFiles=0
DontOverwriteNewerExistingFiles=0 # If this is used ContinuePartiallyTransmittedFiles will not work!

DeleteAdditionalFilesInDestinationDir=0 # Deletes files in DestDir which are not present in SourceDir
RemoveSourceFilesAfterTransfer=0 # Moves the files instead of copying them

ExcludeParams='--exclude-glob .* --exclude-glob .*/' # Exclude (hidden) files and direcories -> starting with a dot

OnlyShowChangesButDontChangeFiles=0 # DryRun mode
OutputAsMuchInfoAsPossible=1 # Verbose mode

################################################################################

if [ $CopyServerdataToLocal -eq 1 ]; then
   if [ $OutputAsMuchInfoAsPossible -eq 1 ]; then
      echo "Modus=Download"
   fi
   DIRECTORIES="$SERVERFOLDER $PCFOLDER"
else
   if [ $OutputAsMuchInfoAsPossible -eq 1 ]; then
      echo "Modus=Upload"
   fi
   REVERSE='--reverse'
   DIRECTORIES="$PCFOLDER $SERVERFOLDER"
fi
if [ $IgnoreSubdirectories -eq 1 ]; then
   IGNORESUBDIRS='--no-recursion'
fi

if [ $ContinuePartiallyTransmittedFiles -eq 1 ]; then
   CONTINUEFILES='--continue'
fi
if [ $DontOverwriteNewerExistingFiles -eq 1 ]; then
   ONLYNEWER='--only-newer'
fi
if [ $DeleteAdditionalFilesInDestinationDir -eq 1 ]; then
   DELETE='--delete'
fi
if [ $RemoveSourceFilesAfterTransfer -eq 1 ]; then
   REMOVE='--Remove-source-files'
fi
if [ $OnlyShowChangesButDontChangeFiles -eq 1 ]; then
   DRYRUN='--dry-run'
fi
if [ $OutputAsMuchInfoAsPossible -eq 1 ]; then
   VERBOSE='--verbose'
fi

lftp -f "
open $HOST
user $USER $PASS
lcd $PCFOLDER
mirror $DRYRUN $REVERSE $IGNORESUBDIRS $DELETE $REMOVE $CONTINUEFILES $ONLYNEWER $CopyMoreThanOneFileSimultaneously --use-cache $ExcludeParams $VERBOSE $DIRECTORIES
bye
"

【讨论】:

这个网站帮助我创建了那个脚本:cyberciti.biz/faq/lftp-mirror-example(见A complete list of lftp mirror command options

以上是关于使用 FTP(唯一选项)在 linux 中使用单行命令同步目录中的文件的主要内容,如果未能解决你的问题,请参考以下文章

linux 中 使用 cp -rf /mnt/Server* /var/ftp/pub 时 添加啥选项可以忽略提示的yes

ftp命令

在单行中组合/合并多列唯一值

jMeter没有FTP请求选项

在Visual Studio中发布控制台应用程序的Ftp选项在哪里

FTP命令