Schließen Sie ein Verzeichnis in dem mit ls übereinstimmenden Muster aus

13

Ich versuche lsdirs, die .pngDateien enthalten (keine Notwendigkeit für Rekursivität, obwohl es besonders nützlich wäre), mit Ausnahme einer. Ein Verzeichnis ausschließen, z

ls */*.png

funktioniert gut.

ls (^one)*/*.png

Gibt keine Standardausgabe zurück. Wie erreiche ich das?

Ich bin blind und pfeife es an espeak, also kann ich erst mal stdout hören.

Tomas Jankus
quelle
Welche Shell benutzt du? Ihr Muster sieht aus wie ein zsh-Muster, obwohl es kein nützliches ist, da es nicht ausschließen würde one(das richtige Muster wäre es ^one/*.png), es würde alles drucken.
Gilles 'SO- hör auf böse zu sein'

Antworten:

16

Option 1 - nur verwenden ls:
Mit aktiviertem Extended Bash Globbing ( shopt -s extglob) können Sie Folgendes tun:

ls !(one*)/*.png


Option 2 - Kombination lsund grep:

Sie können kombinieren lsmitgrep -v

  • z.B ls */*.png | grep -v "one/"


Option 3 - (die beste IMO) verwendet aber findnicht ls:

Zum rekursiven Durchsuchen aller Unterverzeichnisse mit find

find . -type f -name "*.png" -not -path "*/one/*"


Alle oben genannten Einzeiler listen Verzeichnisse mit .pngDateien auf, während alle übereinstimmenden Pfade herausgefiltert werden one/. Nur Option 3 führt dies rekursiv aus.

toxefa
quelle
Muss der findBefehl nicht sagen -path "*/one/*"oder -path "./one/*"?
G-Man sagt, dass Monica am
@ G-Man Du hast absolut recht. Oben bearbeitet.
Toxefa
Wäre das nicht immer noch passend ./phone/handset.png?
G-Man sagt, dass Monica am
@ G-Man Was stimmt nicht mit übereinstimmenden .pngs in einem Verzeichnis namens phone? Ich dachte, wir wollten nur ausschließen one?
Toxefa
1
Nun, da Sie es in Verbindung mit verwenden -not, bedeutet dies, dass es dazu führt find, dass Dateien in einem Verzeichnis mit dem Namen ausgeschlossen werden phone.
G-Man sagt, dass Monica am
6

In zsh setzen Sie setopt extended_globin Ihrem ~/.zshrc. Dann können Sie das Platzhaltermuster verwenden ^one , um das aufgerufene Verzeichnis auszuschließen one.

ls ^one/*.png

Wenn Sie eine Rekursion in Unterverzeichnisse durchführen möchten, verwenden Sie diese Option **/für rekursives Globbing. So schließen Sie das oneauf der obersten Ebene aufgerufene Verzeichnis sowie das Verzeichnis auf der obersten Ebene aus:

ls ^one/**/*.png

So schließen Sie Dateien in einem aufgerufenen Unterverzeichnis aus one, jedoch keine Dateien in dessen Unterverzeichnissen:

ls **/^one/*.png

oneVerwenden Sie ein Wiederholungsmuster mit dem #Operator um die Negation, um Dateien in einem Unterverzeichnis auszuschließen, das auf einer beliebigen Ebene aufgerufen wird :

ls (^one/)#/*.png
Gilles 'SO - hör auf böse zu sein'
quelle