Linux lftp使用Bash删除多个文件

Linux lftp使用Bash删除多个文件,linux,bash,file,xargs,lftp,Linux,Bash,File,Xargs,Lftp,我尝试创建一个脚本,用lftp删除我备份目录中除三个最近文件之外的所有旧文件 我试着用ls-1tr来实现这一点,ls-1tr以升序顺序返回所有文件,在我执行head后-$NB_BACKUP_to_RM$NB_BACKUP_to_RM是我要在列表中删除的文件数,这两个命令返回正确的文件 在这之后,我想删除所有文件,所以我做了一个xargsrm-,但是Bash返回文件不存在。。。我想这个命令不是在远程目录下运行,而是在本地目录下运行,我不知道我能做些什么来删除我的返回列表中的这些文件 以下是完整的代

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

我试着用ls-1tr来实现这一点,ls-1tr以升序顺序返回所有文件,在我执行head后-$NB_BACKUP_to_RM$NB_BACKUP_to_RM是我要在列表中删除的文件数,这两个命令返回正确的文件

在这之后,我想删除所有文件,所以我做了一个xargsrm-,但是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\u DIR/full\u backup\u ftp*和head-NB\u backup\u TO\u RM之后,如何删除列表中的文件


感谢您的帮助

看起来xargs对于lftp在man 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

看起来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命令与外部命令混合使用。它创建了一个命令文件,其中包含一系列利用head、xargs等的“rm”,并在同一个lftp会话中执行这些命令

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

确保仔细测试,因为可能会删除重要文件

或者使用一个线性程序,使用“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__

启动SFTP连接可能很耗时。稍微修改了解决方案,以避免下面的多个lftp会话。它将比替代解决方案执行得更好,尤其是在必须清除大量文件的情况下

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

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

确保仔细测试,因为可能会删除重要文件

或者使用一个线性程序,使用“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__

非常感谢您的回答,我不知道xargs-I的用法,因为它允许向我的每个文件发送rm命令,它工作得非常好!非常感谢您的回答,我不知道xargs-I的用法,因为它允许向我的每个文件发送rm命令,它工作得非常好!感谢您的回答,我喜欢这种方法,但我有两个更正:lftp-e$USER、$PASSWORD$HOST将-e替换为-u,将xarg替换为xargs。另外,您的第一个rm_list.txt方法工作得很好,但是第二个方法return cls命令找不到,您知道为什么吗?同样,对于我用cls和ls尝试的第一种方法,它们都返回相同的数据,您确定ls不允许通配符吗?因为它似乎对我的剧本有效。无论如何,感谢您的帮助和回答。谢谢您的回答,我喜欢这种方法,但我有两个更正:lftp-e$USER、$PASSWORD$HOST将-e替换为-u,将xarg替换为xargs。另外,您的第一个rm_list.txt方法工作得很好,但是第二个方法return cls命令找不到,您知道为什么吗?同样,对于我用cls和ls尝试的第一种方法,它们都返回相同的数据,您确定ls不允许通配符吗?因为它似乎对我的剧本有效。无论如何,谢谢你的帮助和回答。