Como remover vários arquivos usando o sftp

12

Esta publicação é sobre a remoção de vários arquivos do servidor remoto, quando a senha sftp menos conexão é configurada. Eu tenho o código como abaixo. Somente o primeiro arquivo da variável $file_listé excluído, quando tenho a variável definida como,

$file_list="file1 file2"

sftp $USER@$HOST
rm $file_list
quit
SFTP-Session

Eu até tentei executar os comandos no modo prompt.

sftp $USER@$HOST
rm file1 file2

No entanto, ainda vejo que apenas o arquivo1 está sendo excluído.

Não tenho certeza se estou perdendo algum comando básico. Eu tentei mdelete/ mdel/ mrm, que foram rejeitados como comando inválido na janela de prompt do sftp.

bhawna
fonte

Respostas:

8

Aqui está uma solução possível que pode ser adicionada ao script bash. Isso não é ideal, pois fará uma nova conexão para cada arquivo.

#!/bin/bash
# set variables
USER="username"
HOST="hostname"
file_list="file1 file1 file3 file4"
# delete each file
for file in $file_list; do
    echo "rm $file" | sftp $USER@$HOST
done
exit 0

Este one-liner é muito melhor! arquivo1-9 sendo nomes de arquivo a serem removidos, use uma variável, se quiser, é a mesma coisa.

for file in file1 file2 file3 file4 file5 file6 file7 file8 file9; do echo -e "rm $file" >> sftp_batch; done; sftp -b sftp_batch username@hostname; rm sftp_batch
mbiber
fonte
E se os arquivos tiverem espaços em branco em seu nome? Esta solução funcionará?
precisa saber é o seguinte
Você pode citar os nomes dos arquivos. Se você tiver muitos deles, sugiro que você analise a expansão dos parâmetros do bash para obter melhores resultados. Geralmente, por simplicidade, um administrador não permitirá nomes de arquivos com espaços em branco e caracteres relacionados.
mbiber
1

Você não pode fornecer uma lista para o rmcomando sftp, apenas usa um caminho, como está escrito na página do manual:

rm path
    Delete remote file specified by path.
user90256
fonte
1

Eu normalmente uso lftppara fazer isso.

Configuração - no skin do servidor rmeote
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
agora deletamos
$ file_list="afile1 afile2"
$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list"
cd ok, cwd=/home/sam/adir    
rm ok, 2 files removed                 
lftp sam@skinner:~/adir> ls
drwxr-xr-x    2 sam      users        4096 Nov  4 11:52 .
drwxr-x---  131 sam      users       20480 Nov  4 11:51 ..
lftp sam@skinner:~/adir> bye

Para torná-lo um único comando:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"
slm
fonte
Não consigo executar o comando lftp, pode ser que exija alguns arquivos de biblioteca.
Bhawna
@bhawna - pode não estar instalado.
Slm
1

Se você pode sftp, você não pode executar ssh? Nesse caso, um comando como:

 ssh user@hostname rm file1 file2 

deve funcionar bem. Se você usar chaves SSH públicas / privadas, não haverá solicitação de senha.

mdpc
fonte
Sim, funcionou, mas o comando acima não cria nenhuma informação de log e o requisito é criar também (embora eu não tenha especificado na pergunta). Graças
Bhawna
1

Se esses são os nomes dos arquivos. Você pode excluí-los usando um padrão glob com

rm file*
Philip Rego
fonte
Bem, com certeza não fui eu.
Kusalananda
Eu tentei esse método e funcionará se você estiver usando o SFTP para acessar seu servidor remoto.
MrMauricioLeite