So entfernen Sie mehrere Dateien mit sftp

12

In diesem Beitrag werden mehrere Dateien vom Remote-Server entfernt, wenn eine Verbindung ohne SFTP-Kennwort eingerichtet wird. Ich habe den Code wie folgt. Nur die erste Datei in der Variablen $file_listwird gelöscht, wenn ich die Variable als

$file_list="file1 file2"

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

Ich habe sogar versucht, die Befehle im Eingabeaufforderungsmodus auszuführen.

sftp $USER@$HOST
rm file1 file2

Ich sehe jedoch immer noch, dass nur Datei1 gelöscht wird.

Ich bin nicht sicher, ob mir ein grundlegender Befehl fehlt. Ich versuchte mdelete/ mdel/ mrm, die als abgelehnt wurden Ungültiger Befehl in SFTP Aufforderung.

Bhawna
quelle

Antworten:

8

Hier ist eine mögliche Lösung, die zum Bash-Skript hinzugefügt werden kann. Dies ist nicht ideal, da für jede Datei eine neue Verbindung hergestellt wird.

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

Dieser Einzeiler ist viel besser! Datei1-9 Da es sich um zu entfernende Dateinamen handelt, können Sie auch eine Variable verwenden.

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
quelle
Was ist, wenn die Dateien Leerzeichen im Namen haben? Funktioniert diese Lösung?
Codeforester
Sie können die Dateinamen in Anführungszeichen setzen. Wenn Sie viele davon haben, empfehlen wir Ihnen, sich mit der Bash-Parameter-Erweiterung zu befassen, um die besten Ergebnisse zu erzielen. Im Allgemeinen lässt ein Administrator der Einfachheit halber keine Dateinamen mit Leerzeichen und verwandten Zeichen zu.
mbiber
1

Sie können dem rmBefehl in keine Liste geben, sondern sftpnur einen Pfad wie in der Manpage beschrieben:

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

Normalerweise lftpmache ich das so.

Setup - auf dem Remote Server Skinner
$ mkdir adir
$ touch afile1 afile2
$ ls
afile1  afile2
jetzt löschen wir
$ 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

So erstellen Sie einen einzelnen Befehl:

$ lftp sftp://sam@skinner -e "cd ~/adir; mrm $file_list; bye"
slm
quelle
Ich kann den Befehl lftp nicht ausführen. Möglicherweise sind einige Bibliotheksdateien erforderlich.
Bhawna
@bhawna - möglicherweise nicht installiert.
slm
1

Wenn Sie sftp können, können Sie nicht ssh ausführen? Wenn ja, dann ein Befehl wie:

 ssh user@hostname rm file1 file2 

sollte gut funktionieren. Wenn Sie öffentliche / private SSH-Schlüssel verwenden, erfolgt keine Passwortabfrage.

mdpc
quelle
Ja, es hat funktioniert, aber der obige Befehl erstellt keine Protokollinformationen, und die Anforderung ist, auch ein Protokoll zu erstellen (obwohl ich es in der Frage nicht angegeben habe). Vielen Dank
Bhawna
1

Wenn das die Dateinamen sind. Sie können sie mit einem Glob-Muster löschen

rm file*
Philip Rego
quelle
Nun, ich war es nicht.
Kusalananda
Ich habe diese Methode ausprobiert und sie funktioniert, wenn Sie SFTP verwenden, um auf Ihren Remote-Server zuzugreifen.
MrMauricioLeite