【问题标题】:lftp delete multiples files with Bashlftp 使用 Bash 删除多个文件
【发布时间】:2019-11-12 22:15:44
【问题描述】:

我尝试创建一个脚本,该脚本使用 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 之后)

感谢您的帮助

【问题讨论】:

    标签: linux bash file xargs lftp


    【解决方案1】:

    启动 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__
    

    【讨论】:

    • 感谢您的回答,我喜欢这个方法,但我有两个更正:lftp -e $USER,$PASSWORD $HOST-e 替换为-u 并将xarg 替换为xargs。同样,您使用rm_list.txt 的第一种方法效果很好,但是第二种方法返回cls command not found 您知道为什么吗?同样,我尝试使用clsls 的第一种方法都返回相同的数据,您确定ls 不允许通配符吗?因为它似乎适用于我的脚本。无论如何感谢您的帮助和回答。
    【解决方案2】:

    man lftp 之后,对于 lftp,xargs 看起来是未知 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 -I 允许向我的每个文件发送rm 命令的用法,它工作得很好!
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2022-11-17
    • 2023-03-17
    • 1970-01-01
    • 2022-01-22
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多