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.

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

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.

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"

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.


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*

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.