lftp 使用 Bash 删除多个文件

lftp delete multiples files with Bash

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

我已经尝试用 ls -1tr 来做到这一点,谁 return 所有文件都按日期升序排列,在我做了 head -$NB_BACKUP_TO_RM ($NB_BACKUP_TO_RM 之后我想在列表中删除的文件数),这两个命令 return 正确的文件。

在此之后我想删除所有这些文件,所以我做了一个 xargs rm --,但是 Bash return 文件不存在...我认为这个命令不是 运行 到远程目录,而是在本地目录,我不知道我能做些什么来删除这个文件(在我的 return 列表中)。

完整代码如下:

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 之后)

感谢您的帮助

看起来 xargs 是 man lftp 之后 lftp 的未知 cmd。并且 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' 能力来执行动态生成的命令 (source -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__