PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zur Bash-Programmierung


Gast
2007-10-09, 11:41:26
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?

Gast
2007-10-09, 11:54:06
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]

Gast
2007-10-09, 17:48:56
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.

Gast
2007-10-10, 02:22:26
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.

Gast
2007-10-11, 15:45:45
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.