Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zur Bash-Programmierung
Ich wil ein kleines Script schreiben,
daß das Dateien aus einer Datei ausliest
und diese Dateien dann mit rm löscht.
Wie geht so etwas?
Ich habe z.b. eine Dateiliste Namens files.txt
Darin stehen Dateien inkl. deren Pfad drin, z.B.:
foobar.bin
share/bla.ico
README
Und jetzt sollen diese Dateien automatisiert mithilfe der Dateiliste files.txt gelöscht werden.
Wie geht das?
Ok, hat sich erledigt, habe eine Lösung gefunden.
piepre
2007-10-09, 14:25:05
Dann auch immer die Lösung schreiben, falls jemand diesen Beitrag über die Suche findet...
Eine von vielen Möglichkeiten (ist mir als erstes eingefallen):
rm -rf `cat files.txt`
majortom
2007-10-09, 16:32:35
das packste einfach in ein shell-script:
for i in `cat fileliste.txt`
do
rm -f $i
done
Gruss
clm[k1]
2007-10-09, 16:46:32
das packste einfach in ein shell-script:
for i in `cat fileliste.txt`
do
rm -f $i
done
Gruss
Das kannst du leider vergessen sobald auch nur eine Zeile in der Datei ein Leerzeichen enthält!
Wenn man eine Zeile mit "eine datei" hat (man beachte das Leerzeichen), dann wird er die Schleife einmal für "ein" und einmal für "datei" durchlaufen!
Das muss man deswegen auf folgende Art und Weise machen:
while read g
do
rm ${g}
done < filelist.txt
so long
clm[k1]
Das muss man deswegen auf folgende Art und Weise machen:
while read g
do
rm ${g}
done < filelist.txt
schon toll, was man hier so mitbekommt. interessant ist es allemal.
wärst du noch so freundlich und würdest das für einen anfänger erklären?
es fällt mir wirklich schwer, das zu verstehen, obwohl es nur klein und simpel ist )=
lese solange variable g
anfang
entferne inhalt aus g
ende sende inhalt aus datei xx
Solange er etwas aus "g" lesen kann(bis EOF?), soll er "inhalt aus g" "entfernen". Wieso wird die datei am ende übergeben? geht das überhaupt? wohin wird es übergeben? in "done"?
totaler logikfehler bei mir? gibts bei mir überhaupt eine logik?
majortom
2007-10-09, 20:18:07
;5916525']
Wenn man eine Zeile mit "eine datei" hat (man beachte das Leerzeichen), dann wird er die Schleife einmal für "ein" und einmal für "datei" durchlaufen!
dat is klar, aber bei meiner täglichen Unix-Arbeit kommt ein Filename nur selten mit Leerzeichen daher :|:D
Und wenn ich wie oben vorgehe dann achte ich darauf, dass nicht 2 Files nebeneinander stehen.
Dein script ist aber wirklich effektiver das stimmt. habs ja auch nur ausm Handgelenk getippert.
es fällt mir wirklich schwer, das zu verstehen, obwohl es nur klein und simpel ist )=
lese solange variable g
anfang
entferne inhalt aus g
ende sende inhalt aus datei xx
Solange er etwas aus "g" lesen kann(bis EOF?), soll er "inhalt aus g" "entfernen". Wieso wird die datei am ende übergeben? geht das überhaupt? wohin wird es übergeben? in "done"?
totaler logikfehler bei mir? gibts bei mir überhaupt eine logik?
logikfehler bei dir :)
richtig wäre:
lese zeile (aus stdin) in die variable g ein
lösche datei deren name in g steht
wiederholen bis nichts mehr eingelesen werden kann
das "< filelist.txt" am ende sorgt jetzt dafür, dass der inhalt der datei filelist.txt als eingabe für den stdin verwendet wird. alternativ könntest du auch auf "useless use of cat" zurückgreifen und vor das ganze script ein "cat filelist.txt | " schreiben.
Ihr macht das alles viel zu kompliziert, es geht viel einfacher mit einer einzigen Zeile:
awk '{print}' dateiliste.txt | xargs rm
PS: Ich bin übrigens der Threadstarter.
majortom
2007-10-11, 17:17:04
oha, Crashkurs gehabt?
Na prima, wenns funktioniert.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.