![Verzeichnisse ohne schließende Klammer ')' suchen](https://rvso.com/image/83705/Verzeichnisse%20ohne%20schlie%C3%9Fende%20Klammer%20')'%20suchen.png)
Ich versuche, alle Videoverzeichnisse (keine Dateien) aufzulisten, die nicht mit einer Jahreszahl enden, (2015)
und insbesondere alle Verzeichnisse, in denen keine Jahreszahl angegeben ist und die daher nicht mit einer schließenden Klammer enden )
.
Wie kann ich das Gegenteil von Folgendem tun:
# List all files and directories end with '(2015)'
ls -ld *\(2015\)
# List all files and directories end with ')'
ls -ld *\)
Kann mir jemand erklären, wie das geht?
Antwort1
Versuche dies:
ls -ld *[^\)]
[] - Satz von Zeichen, die uns interessieren
^ - Negation (damit wir Zeichensätze einschließen, die wir nicht wollen)
\) - entkam ')'
Antwort2
In Bash oder Zsh:
for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done
Dadurch werden einfach alle Dateien und Verzeichnisse im aktuellen Verzeichnis durchlaufen und überprüft, ob i) es sich um ein Verzeichnis handelt ( [ -d "$i" ])
und ii) ihr Name nicht mit )
( endet [[ ! "$i" =~ \)$ ]]
. Elemente, die beide Tests bestehen, werden ausgedruckt.
Dies kann mit beliebigen Dateinamen umgehen (das ls
kann nicht).
Antwort3
Methode 1a:
ls -ld -- *[^\)]
(unter Verwendung des […]
Musters der Pfadnamenerweiterung (Platzhalter/Glob):
[abc]
entspricht a
, b
, oder c
;
[^abc]
entspricht allem außer a
, b
, oder c
; [^\)]
entspricht also allem außer )
.)
Methode 2a:
GLOBIGNORE="*)"
ls -ld -- *
Ziemlich selbsterklärend?
Beide Methoden stimmen mit Dateien und anderen Objekten überein, die keine Verzeichnisse sind.
Aktualisiert mit dem Vorschlag von don_crissti, nur Verzeichnisse zu finden:
Methode 1b:
ls -ld -- *[^\)]/
Methode 2b:
GLOBIGNORE="*)/"
ls -ld -- */
/
Beachten Sie, dass Sie im Wert einschließen müssen GLOBIGNORE
.
Antwort4
POSIX:
find . ! -name . -prune -type d ! -name '*)'
Mit zsh
:
print -rl -- *[^\)](/)
Andere Shells wie Bourne haben keine Möglichkeit, Globbing-Ergebnisse zu filtern. Sie können Folgendes verwenden:
printf '%s\n' *[!\)]/
um nur Verzeichnisse abzugleichen. Aber es wird Ihrem Erweiterungsergebnis ein abschließender Schrägstrich hinzugefügt. Mit Verzeichnis foo
erhalten Sie foo/
.