Bash-Dateinamenerweiterung: Vermeidung bestimmter Zeichen

Bash-Dateinamenerweiterung: Vermeidung bestimmter Zeichen

In Bash kann ich Dateinamen Foo1.pngdurch Foo9.pngdie Verwendung von angeben. Die Verwendung von Foo[0-9].pngkann ich vermeiden . Gibt es eine Möglichkeit, eine Reihe von Ausschlüssen für die Dezimalstelle anzugeben?Foo5.pngFoo[1-46-9].png

Wenn ich beispielsweise Foo3.pngund ausschließen möchte Foo7.png, könnte ich verwenden Foo[0-24-689], aber ein Muster wie wäre für mich Foo[^37].pngviel einfacher zu lesen. Das ist die Vim-Syntax und Bash interpretiert sie nicht, wenn 3und ausgeschlossen werden 7. Aber ich habe mich gefragt, ob Bash ein Muster für den Ausschluss von Zeichen in seiner Dateinamenerweiterung hat.

Wenn es eine passende Lösung gibtalleeinzelne Zeichen außer 3oder 7wären unter bestimmten Umständen ebenfalls hilfreich (beispielsweise in dem speziellen Fall, der diese Frage motiviert hat, ungeachtet der obenstehenden, übermäßig vereinfachten Beschreibung).

Antwort1

Die bashShell versteht sowohl das Muster ähnlich wie bei regulären Ausdrücken Foo[^37].pngals auch das Standardmuster der Shell Foo[!37].png, Sie können sie also problemlos verwenden, sofern Sie keine anderen Dateien mit Namen wie Food.pngoder Fool.pngusw. haben, die Sie ausschließen müssen.

Wenn Foo[^37].pngin Ihrem Skript nicht wie erwartet funktioniert, deutet dies darauf hin, dass Sie nicht bash, sondern eine andere Shell wie zB verwenden dash(möglicherweise auf einem Nicht-GNU-System?). Haben Sie das Skript mit shauf der Kommandozeile ausgeführt? Wenn ja, tun Sie das nicht und verwenden Sie stattdessen eine entsprechende #!-Zeile im Skript, die auf den richtigen Shell-Interpreter verweist.

Angenommen, es gibt solche Namen Food.png, die Sie ausschließen möchten, stellen Sie sicher, dass Fooeine Ziffer folgt, und .pngverwenden Sie dann Foo[0-9].png. Um dann Foo3.pngund Foo7.pngdavon auszuschließen, testen Sie diese separat.

for name in Foo[0-9].png; do
    case $name in (*[37].png) continue; esac

    # process "$name" here
done

Oder, mit bashSyntax,

for name in Foo[0-9].png; do
    [[ $name == *[37].png ]] && continue

    # process "$name" here
done

Wie Stéphane Chazelas in den Kommentaren unten erwähnt, können Sie ein erweitertes Globbing-Muster verwenden, bashum auf andere Ziffern als 3und zu testen 7. Aktivieren Sie erweiterte Globbing-Muster mit shopt -s extglobund verwenden Sie dann das Muster

Foo!(!([0-9])|[37]).png

Für mich persönlich wäre es jedoch schneller, das Skript wie in der ersten Hälfte dieser Antwort zu schreiben (oder zu verwenden Foo[01245689].png), es auszuführen und fertig zu sein, bevor ich entscheide, dass dieser Ausdruck meiner Meinung nach das Richtige tut (was er tut).

verwandte Informationen