Hallo Leute, nach dem ich mit rsync etwas unvorsichtig war, habe ich ein kleines Problem. Ich habe in einem ordner nun Dateien, die nun gleich sind, nur einmal groß geschrieben und einaml klein. Nun Frage ich mich, wie alle zig hundert Dateien vergleichen kann und doppelte rausschmeißen kann. Hat da jemand eine Idee? Gruß Can
Am Mittwoch, 1. September 2004 22:28 schrieb Can-Carlo Dörtbudak:
nach dem ich mit rsync etwas unvorsichtig war, habe ich ein kleines Problem. Ich habe in einem ordner nun Dateien, die nun gleich sind, nur einmal groß geschrieben und einaml klein. Nun Frage ich mich, wie alle zig hundert Dateien vergleichen kann und doppelte rausschmeißen kann.
Hat da jemand eine Idee?
Ja :-) Wenn es tatsächlich so ist, dass immer eine groß- und eine kleingeschriebene Datei existiert (also keine Mischformen ala Affe AFFE, aFFe, AffE ... auftreten), dann kannst Du das relativ einfach machen (ungetestet!): ls *[A-Z]* | while read gross; do klein="`echo "$gross" | tr '[:upper:]' '[:lower:]'`" test -f "$klein" && rm "$klein" done oder umgedreht - je nachdem wie Du es haben willst. Anm.: Die while-Schleife mit read statt eines einfachen for gross in *[A-Z]*; do .. wegen möglicher Leerzeichen in den Dateinamen. Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Jan Trippler wrote: [Wednesday 01 September 2004 22:41]
ls *[A-Z]* | while read gross; do klein="`echo "$gross" | tr '[:upper:]' '[:lower:]'`" test -f "$klein" && rm "$klein" done
Bei *[A-Z]* vermengst du Glob-Syntax mit Regex-Syntax. Mit dem angegebenen Ausdruck erhälst du alle Files, die mindestens einen Großbuchstaben enthalten.
Anm.: Die while-Schleife mit read statt eines einfachen for gross in *[A-Z]*; do .. wegen möglicher Leerzeichen in den Dateinamen.
Das ist zwar besser, aber funktioniert auch nicht 100%. Z.B. werden mehrere aufeinanderfolgende Leerzeichen zu einem einzigen verdichtet, Leerzeichen am Ende oder Anfang fallen weg, Tabulatoren werden zu Leerzeichen verwurstet. Tut mir Leid, daß ich nur Destruktives zu berichten weiß, aber für den konstruktiven Teil bin ich heute schon zu müde. :-) Thomas.
Hallo, Am Wed, 01 Sep 2004, Thomas Hofer schrieb:
Jan Trippler wrote: [Wednesday 01 September 2004 22:41]
ls *[A-Z]* | while read gross; do klein="`echo "$gross" | tr '[:upper:]' '[:lower:]'`" test -f "$klein" && rm "$klein" done
Jan, du musst arg muede sein ;)
Bei *[A-Z]* vermengst du Glob-Syntax mit Regex-Syntax. Mit dem angegebenen Ausdruck erhälst du alle Files, die mindestens einen Großbuchstaben enthalten.
Korrekt. Und das quoting von "$gross" passt nicht. ==== ls | grep '^[[:upper:]]\+$' | while read gross; do klein="`echo \"$gross\" | tr '[:upper:]' '[:lower:]'`" cmp -s "$gross" "$klein" && test -f "$klein" \ && test ! -h "$klein" && echo rm -f "$klein" done ==== Das obige sollte mit allen Dateinamen, die kein '\0' und kein '\n' enthalten klarkommen, das rm ist erstmal entschaerft. Den Test auf symlink kann man ggfs. weglassen. Das ganze kann man natuerlich so umdrehen, dass die grossbuchstabigen Versionen geloescht werden. ==== ls | grep '^[[:upper:]]\+$' | while read gross; do klein="`echo \"$gross\" | tr '[:upper:]' '[:lower:]'`" cmp -s "$gross" "$klein" && test -f "$gross" \ && test ! -h "$gross" && echo rm -f "$gross" done ==== Man kann natuerlich auch nach den kleinen Versionen suchen. -dnh --
Stop it, I can't hear the signal through all this noise. The frequency of these cascades really Hertz. Watt? -- in asr
Hallo an euch alle, vielen Dank für eure schnellen Antworten. Das System hat wunderbar geklappt. Ich habe es mit Davids entschärfter Version versucht. Gruß Can
Am Donnerstag, 2. September 2004 08:26 schrieb David Haller:
Am Wed, 01 Sep 2004, Thomas Hofer schrieb:
Jan Trippler wrote: [Wednesday 01 September 2004 22:41]
ls *[A-Z]* | while read gross; do klein="`echo "$gross" | tr '[:upper:]' '[:lower:]'`" test -f "$klein" && rm "$klein" done
Jan, du musst arg muede sein ;)
Nö. Ich habs nur nicht getestet, deshalb auch der entspr. Hinweis.
Bei *[A-Z]* vermengst du Glob-Syntax mit Regex-Syntax.
Nein. s. u.
Mit dem angegebenen Ausdruck erhälst du alle Files, die mindestens einen Großbuchstaben enthalten.
Ja. s. u.
Korrekt. Und das quoting von "$gross" passt nicht.
Der Ausdruck *[A-Z]* ist volle Absicht gewesen - und entspricht IIRC dem Ansinnen des Posters - Zur Erinnerung: <Zitat>
nach dem ich mit rsync etwas unvorsichtig war, habe ich ein kleines Problem. Ich habe in einem ordner nun Dateien, die nun gleich sind, nur einmal groß geschrieben und einaml klein. </Zitat>
Also habe ich ein _globbing_ Pattern genutzt, welches mir alle Dateien auswirft, die mind. einen Großbuchstaben enthalten, also keine, die nur Kleinbuchstaben enthalten. Davids Lösung findet u. U. weniger Dateien, weil sie nur Dateien filtert, die ausschließlich Großbuchstaben enthalten, tut aber sonst das Gleiche. Und BTW: jan@jack:~> echo "ABC" | grep "^[[:upper:]]\+$" ABC jan@jack:~> echo "AB9C" | grep '^[[:upper:]]\+$' jan@jack:~> echo "AB.C" | grep '^[[:upper:]]\+$' jan@jack:~> echo "AB C" | grep '^[[:upper:]]\+$' War das Absicht? Das Entwerten der Quotings von $gross habe ich allerdings unterschlagen (deshalb mein Hinweis *ungetestet*). Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Hallo, Am Thu, 02 Sep 2004, Jan Trippler schrieb: [..]
Und BTW: jan@jack:~> echo "ABC" | grep "^[[:upper:]]\+$" ABC jan@jack:~> echo "AB9C" | grep '^[[:upper:]]\+$' jan@jack:~> echo "AB.C" | grep '^[[:upper:]]\+$' jan@jack:~> echo "AB C" | grep '^[[:upper:]]\+$'
War das Absicht?
Von mir? Ja. Das war quasi der Gegenentwurf zu deinem. "Nur Grossbuchstaben"... Ggfs. war Can-Carlo zu ungenau in der Spezifikation. ;) Vielleicht ist ja grep '^[^[:lower:]]\+$' das gesuchte. Das greift dann alles, was keinen einzigen Kleinbuchstaben enthaelt. -dnh -- Fertility is hereditary. If your parents didn't have any children, neither will you.
Am Mittwoch, 1. September 2004 23:25 schrieb Thomas Hofer:
Jan Trippler wrote: [Wednesday 01 September 2004 22:41]
ls *[A-Z]* | while read gross; do klein="`echo "$gross" | tr '[:upper:]' '[:lower:]'`" test -f "$klein" && rm "$klein" done
Bei *[A-Z]* vermengst du Glob-Syntax mit Regex-Syntax. Mit dem angegebenen Ausdruck erhälst du alle Files, die mindestens einen Großbuchstaben enthalten.
Nein, das ist keine Vermengung. [] als Suchmuster im Globbing sind definiert und ich wollte das Suchmuster exakt so wie es dasteht, mit genau dem von Dir beschriebenen Ergebnis.
Anm.: Die while-Schleife mit read statt eines einfachen for gross in *[A-Z]*; do .. wegen möglicher Leerzeichen in den Dateinamen.
Das ist zwar besser, aber funktioniert auch nicht 100%. Z.B. werden mehrere aufeinanderfolgende Leerzeichen zu einem einzigen verdichtet, Leerzeichen am Ende oder Anfang fallen weg, Tabulatoren werden zu Leerzeichen verwurstet.
Wie kommst Du auf diese Aussage? Ich habe das Entwerten der "" um $gross vergessen - ansonsten macht das Ding genau das was es soll: jan@jack:~/tmp/tst> touch "A B C" " ABC " "A B" jan@jack:~/tmp/tst> for i in *[A-Z]*; do
klein="`echo \"$i\" | tr '[:upper:]' '[:lower:]'`" echo "<$klein>" done <a b> < abc > <a b c> jan@jack:~/tmp/tst> for i in *[A-Z]*; do klein="`echo \"$i\" | tr '[:upper:]' '[:lower:]'`" echo "<$klein>" done | od -cx 0000000 < a \t b > \n < a b c 613c 6209 0a3e 203c 2020 6261 2063 2020 0000020 > \n < a b c > \n \0 0a3e 613c 6220 2020 2020 3e63 000a 0000035
Tut mir Leid, daß ich nur Destruktives zu berichten weiß, aber für den konstruktiven Teil bin ich heute schon zu müde. :-)
Ja ;-) Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Jan Trippler wrote: [Thursday 02 September 2004 20:45]
Am Mittwoch, 1. September 2004 23:25 schrieb Thomas Hofer:
Jan Trippler wrote: [Wednesday 01 September 2004 22:41]
ls *[A-Z]* | while read gross; do klein="`echo "$gross" | tr '[:upper:]' '[:lower:]'`" test -f "$klein" && rm "$klein" done
Bei *[A-Z]* vermengst du Glob-Syntax mit Regex-Syntax. Mit dem angegebenen Ausdruck erhälst du alle Files, die mindestens einen Großbuchstaben enthalten.
Nein, das ist keine Vermengung. [] als Suchmuster im Globbing sind definiert und ich wollte das Suchmuster exakt so wie es dasteht, mit genau dem von Dir beschriebenen Ergebnis.
Ach so - du hast vorausgesetzt, daß entweder alle Zeichen groß oder alle Zeichen klein sind; eine solche Einschränkung habe ich aus dem Ursprungsposting nicht herausgelesen, darum der Einwand.
Anm.: Die while-Schleife mit read statt eines einfachen for gross in *[A-Z]*; do .. wegen möglicher Leerzeichen in den Dateinamen.
Das ist zwar besser, aber funktioniert auch nicht 100%. Z.B. werden mehrere aufeinanderfolgende Leerzeichen zu einem einzigen verdichtet, Leerzeichen am Ende oder Anfang fallen weg, Tabulatoren werden zu Leerzeichen verwurstet.
Wie kommst Du auf diese Aussage?
Das war einfach ein Irrtum - da habe ich Dinge gesehen, die nicht da standen. Beziehungsweise umgekehrt. ;-) Thomas.
participants (4)
-
Can-Carlo Dörtbudak
-
David Haller
-
Jan.Trippler@t-online.de
-
Thomas Hofer