Comment supprimer plusieurs fichiers à l'aide de sftp

13

Ce message concerne la suppression de plusieurs fichiers du serveur distant, lorsque la connexion sans mot de passe sftp est configurée. J'ai le code ci-dessous. Seul le premier fichier de la variable $file_listest supprimé, lorsque la variable est définie sur,

$file_list="file1 file2"

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

J'ai même essayé d'exécuter les commandes en mode invite.

sftp $USER@$HOST
rm file1 file2

Cependant, je vois toujours que seul file1 est supprimé.

Je ne sais pas s'il me manque une commande de base. J'ai essayé mdelete/ mdel/ mrm, qui a été rejeté comme commande non valide dans la fenêtre d'invite sftp.

bhawna
la source

Réponses:

8

Voici une solution possible qui peut être ajoutée au script bash. Ce n'est pas idéal car cela établira une nouvelle connexion pour chaque fichier.

#!/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

Ce one-liner est bien meilleur! file1-9 étant des noms de fichiers à supprimer, utilisez une variable si vous le souhaitez, c'est la même chose.

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
la source
Que faire si les fichiers ont des espaces blancs dans leur nom? Cette solution fonctionnera-t-elle?
codeforester
Vous pouvez citer les noms de fichiers. Si vous en avez plusieurs, je vous suggère de vous pencher sur l'expansion des paramètres bash pour obtenir les meilleurs résultats. Généralement, pour plus de simplicité, un administrateur n'autorisera pas les noms de fichiers avec des espaces et des caractères associés.
mbiber
1

Vous ne pouvez pas donner de liste à la rmcommande dans sftp, ne prenez qu'un seul chemin comme indiqué dans la page de manuel:

rm path
    Delete remote file specified by path.
user90256
la source
1

J'utilise généralement lftppour ce faire.

Configuration - sur le skinner du serveur rmeote
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
maintenant on supprime
$ 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

Pour en faire une seule commande:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"
slm
la source
Je ne suis pas en mesure d'exécuter la commande lftp, peut-être qu'il nécessite des fichiers de bibliothèque.
bhawna
@bhawna - il n'est peut-être pas installé.
slm
1

Si vous pouvez utiliser sftp, ne pouvez-vous pas exécuter ssh? Si oui, alors une commande telle que:

 ssh user@hostname rm file1 file2 

devrait bien fonctionner. Si vous utilisez des clés SSH publiques / privées, il n'y aura pas d'invite de mot de passe.

mdpc
la source
Oui, cela a fonctionné, mais la commande ci-dessus ne crée aucune information de journal, et l'exigence est de créer également un journal (bien que je ne l'ai pas spécifié dans la question). Merci
bhawna
1

Si ce sont les noms de fichiers. Vous pouvez les supprimer en utilisant un modèle global avec

rm file*
Philip Rego
la source
Eh bien, ce n'était certainement pas moi.
Kusalananda
J'ai essayé cette méthode et cela fonctionne si vous utilisez SFTP pour accéder à votre serveur distant.
MrMauricioLeite