lftp用Bash删除多个文件

我尝试创建一个脚本,该脚本使用lftp删除备份目录中最近的三个文件以外的所有旧文件。

我尝试对ls -1tr进行此操作,它们以升序返回所有文件,而在我执行head -$NB_BACKUP_TO_RM之后($ NB_BACKUP_TO_RM是我要删除的文件数列表),这两个命令将返回正确的文件。

此后,我想删除所有这些文件,因此我执行了xargs rm --,但Bash返回该文件不存在...我认为此命令未运行到远程目录中,但是在本地目录,我不知道该如何删除(返回列表中的)此文件。

这是完整的代码:

MAX_BACKUP=3
NB_BACKUP=$(lftp -e "ls -1tr $REMOTE_DIR/full_backup_ftp* | wc -l ; quit" -u $USER,$PASSWORD $HOST)

if (( $NB_BACKUP > $MAX_BACKUP ))
then
   NB_BACKUP_TO_RM=$(($NB_BACKUP-$MAX_BACKUP))
   REMOVE=$(lftp -e "ls -1tr $REMOTE_DIR/full_backup_ftp* | head -$NB_BACKUP_TO_RM | xargs rm -- ; quit" -u $USER,$PASSWORD $HOST)
   echo $REMOVE
fi

您对这个问题有想法吗?如何删除列表中的文件(在ls -1tr $REMOTE_DIR/full_backup_ftp*head -$NB_BACKUP_TO_RM之后)

感谢您的帮助

flh12004029 回答:lftp用Bash删除多个文件

man lftp之后,lftp的xcms未知。并且xargs rm正在删除本地文件,而不是远程文件。

所以请按如下所示使用xargs,它对我有用。

lftp -e "ls -1tr $REMOTE_DIR/full_backup_ftp*; quit" -u $USER,$PASSWORD $HOST | head -$NB_BACKUP_TO_RM | xargs -I {} lftp -e 'rm '{}'; quit' -u $USER,$PASSWORD $HOST
,

启动SFTP连接可能很耗时。略作修改的解决方案,避免了下面的多个lftp会话。与替代解决方案相比,它的性能要好得多,尤其是在必须清除大量文件的情况下。

基本上,利用lftp的灵活性将lftp命令与外部命令混合使用。它创建一个带有一系列“ rm”的命令文件(利用head,xargs等),并在同一lftp会话中执行这些命令。

还请注意,lftp'ls'不允许使用通配符,请改用'cls'

请确保您进行了仔细的测试,因为可能会删除重要文件

lftp -e $USER,$PASSWORD $HOST <<__CMD__
   cls -1tr $REMOTE_DIR/full_backup_ftp* | head -$NB_BACKUP_TO_RM | xarg -I{} echo rm {} > rm_list.txt
   source rm_list.txt
__CMD__

或者使用一个内衬,使用“ lftp”功能执行动态生成的命令(源-e)。它消除了临时文件。

lftp -e $USER,$PASSWORD $HOST <<__CMD__
   source -e 'cls -1tr $REMOTE_DIR/full_backup_ftp* | head -$NB_BACKUP_TO_RM | xarg -I{} echo rm {}'
__CMD__
本文链接:https://www.f2er.com/3113962.html

大家都在问