2012-04-04 8 views
3

Wie löscht man eine Datei in einem Server nach dem Ausführen eines wget aller Dateien?
Ich verstehe den Löschbefehl funktioniert, wenn Sie einen FTP in den Server getan haben, aber ich kann den Befehl nicht verwenden, während ein Shell-Skript ausgeführt wird. Unten ist mein Skript, lass mich bitte wissen, was darin falsch ist.Löschen von Dateien in einem Server mit Shell-Skript

#!/bin/bash 

filelist='ls *20120330*' 
for file in $filelist 
do 
ftp -vn <$hostname> <<EOFD 
    quote USER <username> 
    quote PASS <Pass> 
binary 
ls -lrt *20120330* 
delete $filelist 
quit 
EOFD 
done 
+3

Haben Sie darüber nachgedacht, 'rsync' mit? – Johnsyweb

Antwort

5

Sie

for file in *20120330* 

statt einer Schleife über die wörtliche Worte ls und *20120330* verwenden möchten. Wenn Ihr tatsächlicher Anwendungsfall viel, viel komplexer ist, könnte es einen Grund geben, dass Sie die Dateiliste in einer Variablen haben wollen, aber meine Vermutung ist, dass Sie das nicht tun und nie tun werden.

(Was Sie wahrscheinlich dachten war

for file in `ls *20120330*` 

aber das ist auch falsch, für verschiedene, aber miteinander verbundene Gründe. Siehe auch http://porkmail.org/era/unix/award.html#ls)

Tangential, Sie sind ein Skript wahrscheinlich besser dran zu schaffen, die löscht alle Dateinamen, anstatt eine neue FTP-Sitzung für jede Datei zu erstellen, die Sie entfernen möchten;

#!/bin/bash 

dellist= 
nl=' 
' # yeah, nl is a newline in single quotes 
for file in *20120330* 
do 
    dellist="delete $file$nl" 
done 
ftp -vn <$hostname> <<EOFD 
  quote USER <username> 
    quote PASS <Pass> 
    binary 
    ls -lrt \*20120330\* 
    $dellist 
    quit 
EOFD 
-1
#!/bin/bash 
username=luser 
password=secret 
hostname=localhost 

filelist=`ls *20120330*` 
for f in $filelist; do 
ftp -vn ${hostname} <<EOFD 
    USER ${username} 
    PASS ${password} 
    binary 
    ls -l ${f} 
    delete ${f} 
    quit 
EOFD 
done 
+0

Sehen Sie den Link in meiner Antwort, warum Sie 'ls' in Backticks vermeiden sollten. – tripleee

+0

Ich weiß, dass die Shell das Globbing machen kann. Aber zumindest korrigierte ich die einfachen Anführungszeichen (die) falsch waren in etwas Brauchbares. (nicht testen, FTP hier nicht starten wollen) – wildplasser

+0

Es wird fehlschlagen, wenn Dateien mit Leerzeichen in ihren Namen vorhanden sind oder wenn das Platzhalterzeichen einem Verzeichnis entspricht. Die Lösung ist einfach. Verwenden Sie nicht "ls" und versuchen Sie nicht, die Ergebnisse eines Globs in eine Variable zu schreiben. – tripleee

0

Wenn es eine Option, würde ich mit ncftpget anstelle von normalen ftp empfehlen, da es Funktionen, die es freundlicher zu Scripting wie diese machen.

0

ftp-Befehl

prompt 
mdel *20120330* 
Verwandte Themen