【问题标题】:How to make ftp transfer of multiple files in directory (to remote) using find command output如何使用 find 命令输出将目录中的多个文件(到远程)进行 ftp 传输
【发布时间】:2018-04-02 11:34:38
【问题描述】:

我必须完成一项将 100 多个备份 .tar.gz 文件传输到 ftp 备份服务器的 cron 任务。卡在组合 find 命令中

 find /home/backup -mtime -1 -mmin +59 -type f -name "*.tar.gz*"

这部分工作正常,脚本部分:

#!/bin/sh
USERNAME="user"
PASSWORD="password"
SERVER="someip"
FILE="/home/backup"
DATE="`date +%Y-%m-%d-%H.%M.%S `"
BACKUPDIR="/backup/${DATE}/"

ftp -inv $SERVER <<EOF
user $USERNAME $PASSWORD
mkdir $BACKUPDIR
cd $BACKUPDIR
mput $FILE/*.tar.gz*
quit
EOF

为此

00 12 * * * find /home/backup -mtime -1 -mmin +59 -type f -name "*.tar.gz*" -exec /root/ftp.sh {} \;

不起作用。请不要 scp/ssh 建议)必须使用 ftp 来完成。

【问题讨论】:

  • 在 cronjob 中,您似乎使用 find 为每个 tar.gz 文件调用一次脚本,但在脚本中您使用 mput 和通配符,就像您认为脚本正在传输很多文件...
  • 另外,您没有在脚本中设置 PATH,因此您有点希望它能够以某种方式知道在哪里可以找到 dateftp
  • 感谢您的评论,马克。应尝试以这种方式更改脚本。注意到dateftp 没有问题,可能使用系统变量。
  • 我建议将mput $FILE/*.tar.gz*替换为mput $1
  • 输出看起来像这样/home/backup/20180402_122053_full.tar.gz.29 /home/backup/20180402_122053_full.tar.gz.94 /home/backup/20180402_122053_full.tar.gz.82 /home/backup/20180402_122053_full.tar.gz.3 /home/backup/20180402_122053_full.tar.gz.63

标签: bash ftp


【解决方案1】:

我建议您将 crontab 命令变小。并不是说它不应该按照您的方式工作,但它会更容易理解正在发生的事情。

00 12 * * * sh /root/ftpjob.sh

#!/bin/sh
username="user"
password="password"
server="someip"
sourcedir="/home/backup"
date="`date +%Y-%m-%d-%H.%M.%S `"
remotedir="/backup/${DATE}/"

find /home/backup -mtime -1 -mmin +59 -type f -name "*.tar.gz*" |
 while read filename ; do
    /bin/ftp -inv $server >> /tmp/ftpjob.log <<EOF
user $username $password
mkdir $remotedir
cd $remotedir
put $sourcedir/$filename
EOF
    echo "$date copied $filename" >> /tmp/ftpjob.log
done

只要您确定 tar.gz 文件名中没有空格,这将起作用。

另一方面,如果您能够使用 mput 进行 ftp,则根本没有理由进行查找:

#!/bin/sh
username="user"
password="password"
server="someip"
sourcedir="/home/backup"
date="`date +%Y-%m-%d-%H.%M.%S `"
remotedir="/backup/${DATE}/"

/bin/ftp -inv $server >> /tmp/ftpjob.log <<EOF
user $username $password
mkdir $remotedir
cd $remotedir
mput $sourcedir/*.tar.gz.*
EOF

因此,您可以使用 find 循环遍历文件,如果 tar.gz 文件所在的目录有多个级别,这是一个好主意,或者您可以在 ftp 中使用 mput 如果所有档案总是在同一个目录中。

【讨论】:

  • 感谢您的回答 Ljm,您的建议很有帮助。不幸的是,我无法摆脱find 命令,因为任务是移动今天的备份并忽略旧的备份。抱歉之前没有提到。
【解决方案2】:

基于 Ljm Dullaart 的答案工作脚本如下所示:

#!/bin/sh
USERNAME="user"
PASSWORD="password"
SERVER="someip"
DATE="`date +%Y-%m-%d `"
BACKUPDIR="/${DATE}/"

find . -mtime -1 -mmin +59 -type f -name "*.tar.gz*" -exec basename {} .tar.gz* \; |
  while read filename ; do
    /bin/ftp -inv $SERVER >> /tmp/ftp.log <<EOF
user $USERNAME $PASSWORD
mkdir $BACKUPDIR
cd $BACKUPDIR
put $filename
EOF
    echo "$date copied $filename" >> /tmp/ftp.log
done

还可以使用不同的循环来完成:

#!/bin/sh
USERNAME="user"
PASSWORD="password"
SERVER="someip"
SOURCEDIR="/home/backup"
DATE="`date +%Y-%m-%d `"
BACKUPDIR="/${DATE}/"
cd /home/backup
for i in $(find /home/backup -mtime -1 -mmin +59 -type f -name "*.tar.gz*" -exec basename \{} . \;)
do
/bin/ftp -inv $SERVER >> /tmp/ftp.log <<EOF
user $USERNAME $PASSWORD
mkdir $BACKUPDIR
cd $BACKUPDIR
put $i
EOF
done

两者都可以通过 ftp 上传按日期排序的备份文件。

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 2012-05-25
    • 2013-12-29
    • 2016-10-20
    • 1970-01-01
    • 2014-05-15
    • 2021-09-19
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多