Bash-Shell: Alle Dateien vom Typ .png oder .PNG auflisten?

14

Wie kann ich in einem Bash-Skript für alle Dateien des Typs .png oder .PNG sagen?

Ich versuche :

for i in (`ls *.PNG` && `ls *.png`)

aber immer einen Syntaxfehler.

simon
quelle

Antworten:

18

Wenn Sie alle möglichen Kombinationen wünschen, verwenden Sie:

for i in *.[Pp][Nn][Gg]; do

oder

shopt -s nocaseglob
for i in *.png; do

Dabei wird die Groß- und Kleinschreibung aller Shell-Globs Ihres Skripts (z. B. Übereinstimmungen mit Platzhaltern) nicht beachtet, bis Sie ausgeführt werden shopt -u nocaseglob.

Wenn Sie wirklich nur PNG und PNG (und nicht z. B. PNG oder PNG) möchten, verwenden Sie entweder

shopt -s nullglob
for i in *.png *.PNG; do

oder

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

... Der Grund für die Nullglob- oder Existenzprüfung ist, dass, wenn Sie nur Klein- oder Großbuchstabenerweiterungen haben, das nicht übereinstimmende Muster in die Liste der Dateien aufgenommen wird, was zu einem Fehler im Hauptteil der Schleife führt. Wie bei nocaseglob möchten Sie möglicherweise die Nullglob-Shell-Option nachträglich deaktivieren (obwohl nach meiner Erfahrung das Aktivieren von Nullglob häufig gut ist, insbesondere in einem Skript). Eigentlich halte ich es eher für eine gute Idee, entweder den nocaseglob oder die Existenzprüfung für alle Datei-Übereinstimmungen wie diese zu verwenden, nur für den Fall, dass es keine Übereinstimmungen gibt.

Gordon Davisson
quelle
5
for i in *.{png,PNG}
Glenn Jackman
@glenn: Das würde auch funktionieren (äquivalent zu `* .png * .PNG), obwohl du noch nullglob oder die Existenzprüfung brauchst.
Gordon Davisson
5

Sie könnten auch einen Einzeiler wie versuchen

finden . -iname "* .png" -exec ....

oder

finden . -iname "* .png" | xargs ....

Bearbeiten
Siehe auch @ Yabs Kommentar zur Rekursion.

Alain Pannetier
quelle
1
find ist jedoch standardmäßig rekursiv. Wenn Sie also das gleiche Ergebnis erzielen möchten, müssen Sie dies tun find -maxdepth 1 -iname "*.png"
Yab,
@Yab, du hast vollkommen recht. Ich habe diesen Aspekt übersehen.
Alain Pannetier
1

ls ist hier fast nutzlos, aber für den Datensatz hier ist eine Syntax näher zu Ihrem Versuch:

for i in $(ls *.PNG ; ls *.png)

Anmerkungen:

  • Ich gehe davon aus, dass Sie sowohl Groß- als auch Kleinbuchstaben möchten. Das &&-Trennzeichen bedeutet, dass PNG-Dateien nur verarbeitet werden, wenn PNG-Dateien vorhanden sind. Dies ist wahrscheinlich nicht sehr sinnvoll.
  • Es werden Fehlermeldungen angezeigt, wenn keine Dateien mit einem der Muster gefunden werden.
jlliagre
quelle