
Am Montag, 23. Februar 2009 00:33:50 schrieb David Haller:
Hallo,
Am Son, 22 Feb 2009, Stefan Plenert schrieb:
Am Sonntag, 22. Februar 2009 18:22:29 schrieb David Haller:
Am Son, 22 Feb 2009, Felix Lemke schrieb:
rm `find /home/stefan/ -name *.txt~`
*AUA* *PATSCH*
[..]
rm `find /home/stefan/ -name *.txt~` ist richtig.
\/|_|/_/ \_\_| |___/\___|_||_|\/
NEIN. Und zwar gleich mehrfach.
a) das *.txt~ wird von der shell expandiert, bevor find das zu sehen bekommt:
$ set -x $ ls `find . -name *.txt~` ++ find . -name 'foo bar.txt~' foo.txt~ find: paths must precede expression Usage: find [path...] [expression]
Wenn man a) korrigiert, dann
$ set -x ?
b) versagt es bei Dateinamen mit Leer- und anderen Sonderzeichen:
$ ls `find . -name '*.txt~'` ++ find . -name '*.txt~' + ls -N -T 0 ./foo.txt~ ./foo bar.txt~ ls: ./foo: No such file or directory ls: bar.txt~: No such file or directory ./foo.txt~
c) kann man wg. fehlendem Quoting fiese Dateinamen einschmuggeln.
Korrekt sind (NUR):
find /pfad -name '*.txt~' -exec rm '{}' \; find /pfad -name '*.txt~' -exec rm '{}' + find /pfad -name '*.txt~' -print0 | xargs -r -0 rm
sowie die ersten beiden mit '-ok' statt '-exec'.
Das mittlere geht nur mit BSD find (und sehr neuen GNU finds, IIRC), das letztere geht nur mit GNU find und GNU xargs. Das erste geht überall, ist aber gruselig langsam.
Ein '-delete' hat mein GNU find nicht, neuere und BSD finds sollten das aber haben.
Stefan, lese _DRINGEND_ den Abschnitt QUOTING in 'man bash'. Komplett. So oft bis du verstanden hast, was \, "", '', `` und $() machen.
Danke für den Tip, hat nur ein Fehler, ich habe Suse in deutsch, weil ich so gut wie kein Englisch kann.
-dnh
--
Hallo David, aus O'Reillys Taschenbibliothek LINUX KURZ & GUT Quoting Normalweise behandelt die Shell Leerstellen einfach als Trennsymbole der Wörter auf der Kommandozeile. Falls Sie wollen, dass ein Wort Leerstellen enthält (z.B. Dateiname mit einer Leerstelle), setzen Sie es in einfache oder doppelte Anführungszeichen, damit es die Shell als eine Einheit betrachtet. Einfache Anführungszeichen behandeln den Inhalt wörtlich, während bei doppelten Anführendzeichen Shell-Konstrukte wie Variablen ausgewertet werden: $ echo 'Die Variable HOME hat den Wert $HOME' Die Variable HOME hat den Wert $HOME $ echo "Die Variable HOME hat den Wert $HOME" Die Variable HOME hat den Wert /home/schmidt Bei Backquotes wird der Inhalt als ein Befehl betrachtet und durch die Standardausgabe des Befehls ersetzt. $ /usr/bin/whoami schmidt $ echo Mein Name ist `/usr/bin/whoami` Mein Name ist schmidt
b) versagt es bei Dateinamen mit Leer- und anderen Sonderzeichen
Hier probiere ich noch was in der Shell aus. Platzhalter * jede Art und Menge von Zeichen außer einem führenden Punkt Jede Art von Zeichen und damit nicht auch Leerzeichen? Ist *.txt~ im Quoting nicht doppeltgemoppelt? Ich nahm find mit der Option -delete Gruß Stefan -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org