In Bash kann ich Dateinamen Foo1.png
durch Foo9.png
die Verwendung von angeben. Die Verwendung von Foo[0-9].png
kann ich vermeiden . Gibt es eine Möglichkeit, eine Reihe von Ausschlüssen für die Dezimalstelle anzugeben?Foo5.png
Foo[1-46-9].png
Wenn ich beispielsweise Foo3.png
und 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].png
viel einfacher zu lesen. Das ist die Vim-Syntax und Bash interpretiert sie nicht, wenn 3
und 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 3
oder 7
wä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 bash
Shell versteht sowohl das Muster ähnlich wie bei regulären Ausdrücken Foo[^37].png
als auch das Standardmuster der Shell Foo[!37].png
, Sie können sie also problemlos verwenden, sofern Sie keine anderen Dateien mit Namen wie Food.png
oder Fool.png
usw. haben, die Sie ausschließen müssen.
Wenn Foo[^37].png
in 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 sh
auf 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 Foo
eine Ziffer folgt, und .png
verwenden Sie dann Foo[0-9].png
. Um dann Foo3.png
und Foo7.png
davon 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 bash
Syntax,
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, bash
um auf andere Ziffern als 3
und zu testen 7
. Aktivieren Sie erweiterte Globbing-Muster mit shopt -s extglob
und 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).