Re: " " durch "_" ersetzen
Andreas Bunge
Hallo, wie kann ich ls oder find dazu bringen, daß eine Ausgabe, die Leerzeichen enthält, als EIN Ausdruck angesehen wird? Das Problem ist, daß das Leerezichen anscheinend als Trennzeichen interpretiert wird.
Ja, das ist richtig, nur liegt das nicht an ls oder find, sondern an der Shell. Also muß man sich eine Methode suchen, bei der die bash das nicht mehr tut...
Ziel der Aktion soll sein, daß alle Dateien eines Verzeichnisses und seiner Unterverzeichnisse so umbennant werden, daß kein Leerzeichen mehr vorkommt (" " => "_").
Das kann man für das aktuelle Verzeichnis mit sämtlichen Unterverzeichnissen beispielsweise so tun: find . | grep ' ' | \ while read i; do \ mv "$i" "`echo "$i" | sed 's/ /_/g'`" \ done (Vorsicht, ungetestet. Vielleicht erst einmal mit echo statt mv ausprobieren.) Falls auch in Verzeichnisnamen Leerzeichen vorkommen, ist wohl vorher ein gesonderter Durchlauf mit `find . -type d' am Anfang nötig. Na ja, das war jetzt eine Möglichkeit -- wahrscheinlich werden in den nächsten Mails noch ein halbes Dutzend Alternativen aufgezählt ;-) Eilert -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Eilert Brinkmann -- Universitaet Bremen -- FB 3, Informatik eilert@informatik.uni-bremen.de - eilert@tzi.org - eilert@linuxfreak.com http://www.informatik.uni-bremen.de/~eilert/ --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
Hallo, Eilert Brinkmann wrote:
Andreas Bunge
wrote: Hallo, wie kann ich ls oder find dazu bringen, daß eine Ausgabe, die Leerzeichen enthält, als EIN Ausdruck angesehen wird? Das Problem ist, daß das Leerezichen anscheinend als Trennzeichen interpretiert wird.
find . | grep ' ' | \ while read i; do \ mv "$i" "`echo "$i" | sed 's/ /_/g'`" \ done
Das sollte evtl. besser: "`... | sed s/"\ "/"_"/g` heissen... Jedenfalls sollte IMHO das " " als "\ " maskiert werden... Teste auch mal: for file in "`ls -1A`"; do echo "${file// /_}"; done ^ ^ die " sind entscheidend, dass die Dateinamen in einer Zeile landen! ;) Das sollte so in etwa das sein was du suchst. Das "${file// /_}" macht genau dasselbe wie ein "echo $file | sed s/"\ "/_/", ist aber um einiges schneller (siehe den Thread "Problem mit sed/regex;;"). Getestet mit: === snip === dh@slarty[p7]:~/shelltest $ ls -1 Bla Bla Fasel Bla Fasel dh@slarty[p7]:~/shelltest $ for file in "`ls -1A`"; do echo "${file// /_}"; done Bla_Bla_Fasel Bla_Fasel === snap === CU David -- Who can possibly rule, if no one who wants to do it, can be allowed to? --- Douglas Adams, Hitchhiker's Guide to the Galaxy email: David@dhaller.de www: www.dhaller.de --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com
participants (2)
-
David@dhaller.de
-
eilert@Informatik.Uni-Bremen.DE