
Hallo Liste. Folgendes funktioniert: for DATEI in *; do echo $DATEI done Damit bekomme ich alle Dateien angezeigt, die im aktuellen Verzeichnis sind, und zwar bei jedem Schleifendurchlauf jeweils die nächste Datei. Warum funktioniert folgendes nicht? for VERZEICHNIS in "/home/*/.local/share/Trash"; do echo $VERZEICHNIS done Diese Konstruktion wirft mir schon beim ersten Durchlauf als Wert von $VERZEICHNIS aus: /home/user1/.local/share/Trash /home/user2/.local/share/Trash /home/user3/.local/share/Trash Mein Ziel: ich möchte in einem Skript sämtliche auf dem System vorhandenen Trashes leeren. Dazu muß ich die Trash-Verzeichnisse zuerst finden, und das gelingt mir nicht. -- Andre Tann

Hallo Andre! Am Montag 11 September 2006 09:47 schrieb Andre Tann:
Mein Ziel: ich möchte in einem Skript sämtliche auf dem System vorhandenen Trashes leeren. Dazu muß ich die Trash-Verzeichnisse zuerst finden, und das gelingt mir nicht.
Schaue Dir einmal find an. Gruß Frank

Am Mon, 11 Sep 2006 09:47:14 +0200 schrieb Andre Tann:
Mein Ziel: ich möchte in einem Skript sämtliche auf dem System vorhandenen Trashes leeren. Dazu muß ich die Trash-Verzeichnisse zuerst finden, und das gelingt mir nicht.
for trashdir in $(find /home -type d -a -name Trash); do rm $trashdir/* done Für alles weitere schau in die Manpage von find. Philipp

Am Montag 11 September 2006 10:07 schrieb Philipp Thomas:
Am Mon, 11 Sep 2006 09:47:14 +0200 schrieb Andre Tann:
Mein Ziel: ich möchte in einem Skript sämtliche auf dem System vorhandenen Trashes leeren. Dazu muß ich die Trash-Verzeichnisse zuerst finden, und das gelingt mir nicht.
for trashdir in $(find /home -type d -a -name Trash); do rm $trashdir/* done
Tipp: Mittels -exec kann man eine gefundene Datei direkt an einen Befehl übergeben. Gruß Frank

Philipp Thomas, Montag, 11. September 2006 10:07:
for trashdir in $(find /home -type d -a -name Trash); do rm $trashdir/* done
Das findet mir alle Verzeichnisse, die Trash heißen. Das will ich aber nicht. Ich möchte nur genau diese Verzeichnisse treffen: /home/*/.local/share/Trash, wobei der * für alle User steht, die in /home ihr Homeverzeichnis haben. -- Andre Tann

Hallo, Am Mon, 11 Sep 2006, Andre Tann schrieb:
Philipp Thomas, Montag, 11. September 2006 10:07:
for trashdir in $(find /home -type d -a -name Trash); do rm $trashdir/* done
Das findet mir alle Verzeichnisse, die Trash heißen. Das will ich aber nicht. Ich möchte nur genau diese Verzeichnisse treffen: /home/*/.local/share/Trash, wobei der * für alle User steht, die in /home ihr Homeverzeichnis haben.
find /home/*/.local/share/Trash -type f -print0 | xargs -r -0 rm -f Das sind aber GNUismen. -dnh -- God must love the Common Man; He made so many of them. -- BSD fortune file

Hallo, Am Mon, 11 Sep 2006, Philipp Thomas schrieb:
Am Mon, 11 Sep 2006 12:58:32 +0200 schrieb David Haller:
find /home/*/.local/share/Trash -type f -print0 | xargs -r -0 rm -f
^^sollte das nicht \* sein?
Noe, das soll mir die shell zu einer Pfadangabe fuer find expandieren. (0)$ ls -b1 home/ b\ a\ r\ f foo (0)$ find home/* -print0 > /dev/null + find 'home/b a r f' home/foo -print0 (0)$ find home/\* -print0 > /dev/null + find 'home/*' -print0 find: home/*: No such file or directory (1)$ Siehe "find --help | head -n 1": Usage: find [path...] [expression] Hast du das evtl. mit nem Stern in einer '-name' oder '-path' Expression verwelchselt? Also sowas: find /home -path home/\*/.local/ Das ist ne andere Baustelle ;) -dnh -- 189: Linux-Deathmatch CDs der alten Suse-Distributionen werden am Rand angeschliffen und per Pressluftwerfer wird versucht, damit die Gurgel des entsprechenden Delinquenten zu treffen. (Urs Traenkner)

Am Montag, 11. September 2006 09:47 schrieb Andre Tann:
Folgendes funktioniert:
for DATEI in *; do echo $DATEI done
Damit bekomme ich alle Dateien angezeigt, die im aktuellen Verzeichnis sind, und zwar bei jedem Schleifendurchlauf jeweils die nächste Datei.
Warum funktioniert folgendes nicht?
for VERZEICHNIS in "/home/*/.local/share/Trash"; do echo $VERZEICHNIS done
Weil Du die Anführungszeichen gesetzt hast. Gruß Achim

Hallo, Am Mon, 11 Sep 2006, Andre Tann schrieb:
Warum funktioniert folgendes nicht?
for VERZEICHNIS in "/home/*/.local/share/Trash"; do ^ ^ hier verbietest du der shell, den * zu expandieren.
echo $VERZEICHNIS
Und hier erlaubst du es.
done
Diese Konstruktion wirft mir schon beim ersten Durchlauf als Wert von $VERZEICHNIS aus:
/home/user1/.local/share/Trash /home/user2/.local/share/Trash /home/user3/.local/share/Trash
Und das ist die logische Folge.
Mein Ziel: ich möchte in einem Skript sämtliche auf dem System vorhandenen Trashes leeren. Dazu muß ich die Trash-Verzeichnisse zuerst finden, und das gelingt mir nicht.
for VERZEICHNIS in /home/*/.local/share/Trash; do echo "$VERZEICHNIS" done Besser aber: for VERZEICHNIS in /home/* echo "${VERZEICHNIS}/.local/share/Trash/" ## rm -rf "${VERZEICHNIS}/.local/share/Trash/"* done Noch einfacher: echo "/home/"*"/.local/share/Trash/" ## rm -rf "/home/"*"/.local/share/Trash/"* ^^^ ^^ die beiden * aus den "" rausnehmen ;) Les mal man -L en -P 'less "+/Pathname Expansion"' bash oder bei SelfLinux dazu oder auch "Globbing" (ich weiss nicht genau wie das bei SelfLinux genannt wird). -dnh -- 58: Shareware installieren Die System Clock um drei Monate zurückstellen (Peter Berlich)

David Haller, Montag, 11. September 2006 11:56:
hier verbietest du der shell, den * zu expandieren. [...] Und hier erlaubst du es.
OK, verstanden.
for VERZEICHNIS in /home/*/.local/share/Trash; do echo "$VERZEICHNIS" done
Besser aber:
for VERZEICHNIS in /home/* echo "${VERZEICHNIS}/.local/share/Trash/" ## rm -rf "${VERZEICHNIS}/.local/share/Trash/"* done
Warum ist das besser?
Les mal
man -L en -P 'less "+/Pathname Expansion"' bash
Das werde ich tun, danke. -- Andre Tann

Hallo, Am Mon, 11 Sep 2006, Andre Tann schrieb:
David Haller, Montag, 11. September 2006 11:56:
Besser aber:
for VERZEICHNIS in /home/* echo "${VERZEICHNIS}/.local/share/Trash/" done
Warum ist das besser?
Kam mir heute morgen irgendwie uebersichtlicher vor ;) Vergiss das "besser aber" und lese "oder". -dnh -- Ah, the curse of having old files lying around collecting dust. That file has been sitting on the system for about a decade. Never caused any trouble before now, probably because the teTeX supplied file won out in the kpathsea lottery. -- Harald Hanche-Olsen on the tetex-ML

Hallo, Es geht auch so: for VERZEICHNIS in `ls -l /home` do if [ test -d /home/$VERZEICHNIS -eq 0 ] ; then echo $VERZEICHNIS fi done 2006/9/11, David Haller <lists@dhaller.de>:
Hallo,
Am Mon, 11 Sep 2006, Andre Tann schrieb:
David Haller, Montag, 11. September 2006 11:56:
Besser aber:
for VERZEICHNIS in /home/* echo "${VERZEICHNIS}/.local/share/Trash/" done
Warum ist das besser?
Kam mir heute morgen irgendwie uebersichtlicher vor ;) Vergiss das "besser aber" und lese "oder".
-dnh
-- Ah, the curse of having old files lying around collecting dust. That file has been sitting on the system for about a decade. Never caused any trouble before now, probably because the teTeX supplied file won out in the kpathsea lottery. -- Harald Hanche-Olsen on the tetex-ML
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-linux-unsubscribe@suse.com Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-linux-help@suse.com
-- Stefan Reisinger http://stefanreisinger.at.tf

Hallo, Am Mon, 11 Sep 2006, Stefan Reisinger schrieb:
Es geht auch so:
for VERZEICHNIS in `ls -l /home` do if [ test -d /home/$VERZEICHNIS -eq 0 ] ; then
Wat soll datt dann? Das ist: if test test -d /home/$VERZEICHNIS -eq 0 ; then Und da fehlen mindestens die `` um das innere test. Aber if wertet ja IMMER den Exitstatus aus. Da sieht man mal wieder den Grund warum ich die [ ... ] Form von test nicht mag. Korrekt ist: if test -d "/home/${VERZEICHNIS}" ; then
echo $VERZEICHNIS fi done
Insgesamt auch zu umstaendlich, das `ls` ist ueberfluessig und schon bei Leerzeichen in Dateinamen unbrauchbar. for V in /home/*; do if test -d "${V}/" && test -d "${V}/.local/share/Trash/"; then rm -rf "${V}/.local/share/Trash/"* fi done -dnh -- "Absolute power corrupts absolutely. Which is a problem. If you're powerless." -- Drago Museveni, "Manifesto" CY 8433

Quoting David Haller <lists@dhaller.de>:
Insgesamt auch zu umstaendlich, das `ls` ist ueberfluessig und schon bei Leerzeichen in Dateinamen unbrauchbar.
Nunja.
for V in /home/*; do if test -d "${V}/" && test -d "${V}/.local/share/Trash/"; then rm -rf "${V}/.local/share/Trash/"* fi done
Man kann das auch anders lösen und dabei einen Haufen "test -d" sparen (->bessere Performance). Außerdem brauchst Du wenn Du ein -f ans rm setzt nicht unbedingt testen obs das Zieldirectory auch gibt. Ich würds mal so probieren: ls -d /home/*|while read $dir; do rm -rf "$dir/.local/share/Trash/"* done -- Erhard Schwenk Akkordeonjugend Baden-Württemberg - http://www.akkordeonjugend.de APAYA running System - http://www.apaya.net

Hallo, Am Mon, 11 Sep 2006, Erhard Schwenk schrieb:
Quoting David Haller <lists@dhaller.de>:
Insgesamt auch zu umstaendlich, das `ls` ist ueberfluessig und schon bei Leerzeichen in Dateinamen unbrauchbar.
Nunja.
Probiere es mal. (0)$ ls -b1 home/ b\ a\ r\ f foo (0)$ for d in `ls home/`; do echo "»$d«"; done »b« »a« »r« »f« »foo« (0)$ for d in home/*; do echo "»$d«"; done »home/b a r f« »home/foo« Du kannst gerne beim 'ls' noch rumprobieren, aber auch -b hilft nicht. [..]
Ich würds mal so probieren:
ls -d /home/*|while read $dir; do rm -rf "$dir/.local/share/Trash/"* done
Ja, das klappt in wesentlich mehr Faellen. Im /home o.ae. geht das, aber generell kann das auch Aerger machen. Das ist auch was voellig anderes als das "for x in `ls`;". -dnh -- Calvin: People think it must be fun to be a super genius, but they don't realize how hard it is to put up with all the idiots in the world. Hobbes: Isn't your pants' zipper supposed to be in the front?
participants (8)
-
Achim Schäfer
-
Andre Tann
-
David Haller
-
Erhard Schwenk
-
Frank Lanitz
-
K. Elo
-
Philipp Thomas
-
Stefan Reisinger