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)

Спасибо за вашу помощь


person Florian Richard    schedule 12.11.2019    source источник


Ответы (2)


Похоже, xargs неизвестен cmd для lftp после man lftp. И 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
person suiwenfeng    schedule 13.11.2019
comment
Большое спасибо за ваш ответ, я не знаю, как использовать xargs -I, которые разрешают отправлять команду rm в каждый из моих файлов, это работает отлично! - person Florian Richard; 13.11.2019

Запуск 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__
person dash-o    schedule 13.11.2019
comment
Спасибо за ваш ответ, мне нравится этот подход, но у меня есть две поправки: lftp -e $USER,$PASSWORD $HOST замените -e на -u, а вместо xarg замените на xargs. Также ваш первый метод с rm_list.txt отлично работает, но второй метод возвращает cls command not found. У вас есть идеи, почему? Также с первым методом, который я пробовал с cls и ls, оба возвращают одни и те же данные, вы уверены, что ls не допускает подстановочных знаков? потому что это, кажется, работает над моим сценарием. В любом случае спасибо за помощь и ответ. - person Florian Richard; 13.11.2019