<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage zur Bash und Mustererkennung]]></title><description><![CDATA[<p>Wenn ich in einem Verzeichnis 2 Dateien habe, z.B.:</p>
<p>Test_A12.txt<br />
TEST_A12.txt</p>
<p>Und nun alle Dateien ausgeben möchte, die zwar mit einem Großbuchstaben anfangen, aber dann von Kleinbuchstaben gefolgt werden, was muß ich dann in der Konsole eingeben.</p>
<p>Dieser Befehl, wie ich mir ursprünglich dachte, funktioniert leider nicht, da die Bash das [A-Z] so interpretiert, daß auch mehrere Zeichen mit Großbuchstaben folgen können, aber wie gebe ich nun an, daß nur ein einzelnen Zeichen aus Großbuchstaben bestehen soll?</p>
<pre><code>ls [A-Z][a-z]**
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/271903/frage-zur-bash-und-mustererkennung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 17:04:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271903.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Aug 2010 21:17:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Bash und Mustererkennung on Thu, 05 Aug 2010 21:17:26 GMT]]></title><description><![CDATA[<p>Wenn ich in einem Verzeichnis 2 Dateien habe, z.B.:</p>
<p>Test_A12.txt<br />
TEST_A12.txt</p>
<p>Und nun alle Dateien ausgeben möchte, die zwar mit einem Großbuchstaben anfangen, aber dann von Kleinbuchstaben gefolgt werden, was muß ich dann in der Konsole eingeben.</p>
<p>Dieser Befehl, wie ich mir ursprünglich dachte, funktioniert leider nicht, da die Bash das [A-Z] so interpretiert, daß auch mehrere Zeichen mit Großbuchstaben folgen können, aber wie gebe ich nun an, daß nur ein einzelnen Zeichen aus Großbuchstaben bestehen soll?</p>
<pre><code>ls [A-Z][a-z]**
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1936819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936819</guid><dc:creator><![CDATA[Bash Problem]]></dc:creator><pubDate>Thu, 05 Aug 2010 21:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Bash und Mustererkennung on Thu, 05 Aug 2010 21:39:41 GMT]]></title><description><![CDATA[<p>Klammer setzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936825</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 05 Aug 2010 21:39:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Bash und Mustererkennung on Thu, 05 Aug 2010 22:03:10 GMT]]></title><description><![CDATA[<pre><code>bash: Syntaxfehler beim unerwarteten Wort `('
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1936833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936833</guid><dc:creator><![CDATA[Bash Problem]]></dc:creator><pubDate>Thu, 05 Aug 2010 22:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Bash und Mustererkennung on Fri, 06 Aug 2010 01:07:32 GMT]]></title><description><![CDATA[<p>Das ist eine der Stellen, an denen bash das principle of least surprise massiv verletzt. Schau dir diese bash-session an:</p>
<pre><code>$ ls
test  Test  TEst  TEST
$ ls [A-Z]*
test  Test  TEst  TEST
$ export LC_COLLATE=C
$ ls [A-Z]*
TEST  TEst  Test
</code></pre>
<p>Das Pattern [A-Z] wird abhängig von LC_COLLATE interpretiert. Standardmäßig wird LC_COLLATE bei dir vermutlich leer sein, womit das auf deutsch oder englisch defaultet, je nachdem auf welche Sprache du dein System gestellt hast. Dann ist [A-C] aber nicht äquivalent zu [ABC], sondern zu [AbBcC], weil das die Wörterbuch-Reihenfolge ist.</p>
<p>Dieses Verhalten ist sehr überraschend, aber zugunsten von Bash muss ich dagegenhalten: Es ist präzise dokumentiert, sogar mit Beispielen: <a href="http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching" rel="nofollow">http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching</a></p>
<p>Pattern matching in bash ist aber allgemein sehr primitiv. Die Forderung &quot;das erste Zeichen ein Großbuchstabe, danach nur noch Kleinbuchstaben&quot; kannst du damit nicht umsetzen (ohne die shell-option extglob, siehe unten). Im Zweifelsfall geht das aber alles mit find und der Kommandozeilenoption -regex.</p>
<p>Runde Klammern () sind in bash übrigens sowas wie Schlüsselwörter, die haben praktisch immer eine Spezialbedeutung. Mit pattern matching haben die aber (normalerweise) nichts zu tun. Die runden Klammern braucht man z.B., um Funktionen zu deklarieren, subshells zu öffnen und ähnliches, was mit Prozessen und Funktionen zu tun hat. Bei neuen bash-Versionen kannst du im Prinzip die shelloption &quot;extglob&quot; setzen, dann hast du erweitertes globbing zur Verfügung. Ob das aber so portabel ist, ist zweifelhaft. Ich würde wahrscheinlich eher find mit -regex nehmen, da ist auch die Fehlerbehandlung falls keine Dateien gefunden wurden einfacher (kein redirect von stderr nötig).</p>
<p>Achso, andererseits ist natürlich die Frage, was du mit dem &quot;ls&quot; vorhast. Wenn du über die Dateien iterieren möchtest, dann kann sich die &quot;extglob&quot;-Option auf jeden Fall lohnen:</p>
<pre><code>$ for file in [A-Z]*([a-z]); do echo &quot;$file&quot;; done
Test
$
</code></pre>
<p>Und noch ein edit: Mit ls * gibst du nicht alle Dateinamen aus. Geh mal in dein home-Verzeichnis und mach ls *, dann siehst du, was ich meine. Wenn du Dateinamen ausgeben möchtest, kannst du zum Beispiel eine for-schleife wie die von oben nehmen, echo * (statt ls <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title="*)"
      alt="😉"
    /> oder find. Von echo * würde ich aber abraten, das ist nicht sonderlich robust.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1936849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1936849</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Fri, 06 Aug 2010 01:07:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Bash und Mustererkennung on Fri, 06 Aug 2010 23:48:03 GMT]]></title><description><![CDATA[<p>Ich würde von solchem Bashgerätsel Abstand halten. Habe hier gerade das erste mal von LC_COLLATE gehört aber noch nie vermisst.</p>
<p>Geht erstmal viel einfacher: ls|grep '[A-Z][a-z]*'<br />
Wenn nicht interaktiv, dann lieber, wie schon genannt, find -regex.</p>
<p>Christoph schrieb:</p>
<blockquote>
<p>Achso, andererseits ist natürlich die Frage, was du mit dem &quot;ls&quot; vorhast. Wenn du über die Dateien iterieren möchtest, dann kann sich die &quot;extglob&quot;-Option auf jeden Fall lohnen:</p>
<pre><code>$ for file in [A-Z]*([a-z]); do echo &quot;$file&quot;; done
</code></pre>
</blockquote>
<p>statt for-schleife ist meistens xargs dann auch bequemer. Obiges erweitert dann:</p>
<p>ls|grep '[A-Z][a-z]*'|xargs rm -vi</p>
<p>(gilt aber auch nur interaktiv. Am besten sonst find -print0 | xargs -0)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937330</guid><dc:creator><![CDATA[DrGreenthumb]]></dc:creator><pubDate>Fri, 06 Aug 2010 23:48:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Bash und Mustererkennung on Sat, 07 Aug 2010 10:43:21 GMT]]></title><description><![CDATA[<p>DrGreenthumb schrieb:</p>
<blockquote>
<p>ls|grep '[A-Z][a-z]*'|xargs rm -vi</p>
<p>(<strong>gilt aber auch nur interaktiv.</strong> Am besten sonst find -print0 | xargs -0)</p>
</blockquote>
<p>Ich wollt's gerade sagen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
ls gefolgt von xargs kann zu ganz hässlichen Problemen führen, weil schon ganz simple Sachen wie Dateien mit Leerzeichen im Namen nicht richtig behandelt werden.</p>
<p>find -print0 | xargs -0 kann man übrigens ganz oft ersetzen durch find -execdir. Falls man die Dateien nur löschen möchte, gibt es auch find -delete, das dürfte noch effizienter sein, weil zum Löschen kein Prozess gestartet werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937383</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sat, 07 Aug 2010 10:43:21 GMT</pubDate></item></channel></rss>