SFTP: Verschieben (Umbenennen) vieler Dateien von einem Ordner in einen anderen (nicht nacheinander)

7

Ich muss alle Dateien von current_path nach current_path / DestinationFolder verschieben .

Die Version von SFTP, die ich verwende, ist: SFTP-Protokoll Version 2

Die verfügbaren Befehle sind:

sftp> help
Available commands:
cd path                       Change remote directory to 'path'
lcd path                      Change local directory to 'path'
chgrp grp path                Change group of file 'path' to 'grp'
chmod mode path               Change permissions of file 'path' to 'mode' 
chown own path                Change owner of file 'path' to 'own'
help                          Display this help text
get remote-path [local-path]  Download file
lls [ls-options [path]]       Display local directory listing
ln oldpath newpath            Symlink remote file
lmkdir path                   Create local directory
lpwd                          Print local working directory
ls [path]                     Display remote directory listing
lumask umask                  Set local umask to 'umask'
mkdir path                    Create remote directory
put local-path [remote-path]  Upload file
pwd                           Display remote working directory
exit                          Quit sftp
quit                          Quit sftp
rename oldpath newpath        Rename remote file
rmdir path                    Remove remote directory
rm path                       Delete remote file
symlink oldpath newpath       Symlink remote file
version                       Show SFTP version
!command                      Execute 'command' in local shell
!                             Escape to local shell
?                             Synonym for help

Ich habe keinen Befehl mv . Ich habe RNFT ausprobiert und nicht funktioniert.

Jetzt kann ich umbenennen:

 rename current_path/myFile.txt current_path/DestinationFolder/myFile.txt

und es ist OK. Aber ich muss alle (oder viele ) Dateien verschieben. Folgendes hat nicht funktioniert:

 rename current_path/* current_path/DestinationFolder/

Couldn't rename file "current_path/*" to "current_path/DestinationFolder/": Bad message

Ich habe keinen Zugriff über SSH, daher kann ich keine Aktionen wie echo "ssh login @ server mv * current_path / DestinationFolder /" ausführen.

Ich sollte mich nicht mit diesem Server anlegen: Keine Skripte, keine Aktivitäten usw. Ich bin sehr eingeschränkt.

Könnten Sie mir bitte einen Weg empfehlen, dies zu lösen ?

HINWEIS : Dies ist in SOLARIS.

Kani
quelle
Sie können den Administrator der Box nicht darum bitten?
cjc
Nein, weil ich den Server mehrmals am Tag überprüfen muss: / Dies ist für eine extrem große Finanzorganisation, wir sind allein, ohne ihre Unterstützung.
Kani
Läuft alles unter Solaris, oder können Sie einen anderen Client wie Filezilla ausführen, der zwar nicht in der Lage ist, auf einen Schlag das zu tun, was Sie möchten, Ihnen jedoch bei Bewegungen möglicherweise eine Art Auswahl mehrerer Dateien bietet ? (Eigentlich weiß ich nicht, ob Filezilla das tut, aber es kann andere SFTP-Clients geben, die Ihnen das geben.)
cjc
Alles in Solaris (keine GUIs) und durch Skripte (die Operationen werden ständig durchgeführt): / Danke!
Kani
Was passiert, wenn Sie: sftp> !bashoder sftp> !oder sftp> !id? So etwas funktioniert?
Jay

Antworten:

2

Ich stimme CJC zu. Wenn Sie wirklich auf den obigen Befehl beschränkt sind, mit dem Sie Dateien herunterladen können, geben Sie den lokalen Pfad [Remote-Pfad] ein und scp ihn zurück. Guter Link auch hier .

Ich würde so etwas wie Winscp verwenden , was die Sache viel einfacher macht.

sftp> help put
USAGE: put local-path [remote-path] [-bg | -fg] [-s] [-o] [-r] [-b | -lf]
DESCRIPTION: Upload file.
PARAMETERS:
 -bg   Start (queue) transfer in background.
 -fg   Start transfer in foreground.
 -s    Include subdirectories (recursive).
 -r    Force existing incomplete file to be resumed.
 -o    Force existing file to be overwritten.
 -b    Upload all files as binary; no conversions.
 -lf   Use auto detection upload mode. Text files are uploaded
       in Unix format, with LF as the line delimiter.

NOTES:
 -     If both '-r' and '-o' are specified, resume is tried first,
       and if that fails, overwrite is used.
 -     '-std' and '-t' transfer mode options are also available
       when SFTP version 4 or higher is in use.
Sc0rian
quelle
Vielen Dank. Das könnte getan werden. Aber ich suchte nach einer alternativen Lösung. Denn wenn ich die Dateien auf meinen Server bringe, sie auf den Zielserver im Zielordner lege und die Originale lösche, wenn etwas schief geht (die Kopie ist fehlgeschlagen und alle Originale wurden gelöscht, oder ein anderes katastrophales Ereignis), habe ich keine Weg zurück. Ich denke, die Umbenennung wäre robuster. Was Sie vorschlagen, ist absolut richtig und genau, aber können Sie mir einen anderen Weg empfehlen, der nicht zu viele Transaktionen zwischen den Servern beinhaltet? Danke nochmal.
Kani
2

OpenSSH sftpist kein sehr leistungsfähiger Client für solche Aufgaben. Sie müssten es zweimal ausführen. Um zuerst eine Liste von Dateien zu sammeln, verwenden Sie die Liste, um eine Liste von Befehlen zu generieren, und führen Sie diese in einem zweiten Lauf aus.

Etwas wie das:

files=`sftp -b - [email protected] <<EOF
cd /source/folder
ls
EOF`
files=`echo $files|sed "s/.*sftp> ls//"` 

(
  echo cd /source/folder
  for file in $files; do
    echo get $file
    echo rename $file /destination/folder/$file
  done
) | sftp -b - user@example.com

Bevor Sie das Skript für Produktionsdateien ausführen, geben Sie zunächst die generierte Befehlsliste in eine Datei aus, um zu überprüfen, ob die Ergebnisse den Erwartungen entsprechen.

Ersetzen Sie einfach die letzte Zeile durch:

) > commands.txt
Martin Prikryl
quelle
1
Gute Antwort! Ich benutze diesen sed-Befehl, sed -E "s/.*sftp> ls (\w|\/)*//"da sich das zu lsbearbeitende Verzeichnis auch in der Ausgabe befindet.
Alamoot