Ich versuche ls
dirs, die .png
Dateien 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.
one
(das richtige Muster wäre es^one/*.png
), es würde alles drucken.Antworten:
Option 1 - nur verwenden
ls
:Mit aktiviertem Extended Bash Globbing (
shopt -s extglob
) können Sie Folgendes tun:Option 2 - Kombination
ls
undgrep
:Sie können kombinieren
ls
mitgrep -v
ls */*.png | grep -v "one/"
Option 3 - (die beste IMO) verwendet aber
find
nichtls
:Zum rekursiven Durchsuchen aller Unterverzeichnisse mit
find
Alle oben genannten Einzeiler listen Verzeichnisse mit
.png
Dateien auf, während alle übereinstimmenden Pfade herausgefiltert werdenone/
. Nur Option 3 führt dies rekursiv aus.quelle
find
Befehl nicht sagen-path "*/one/*"
oder-path "./one/*"
?./phone/handset.png
?.png
s in einem Verzeichnis namensphone
? Ich dachte, wir wollten nur ausschließenone
?-not
, bedeutet dies, dass es dazu führtfind
, dass Dateien in einem Verzeichnis mit dem Namen ausgeschlossen werdenphone
.In zsh setzen Sie
setopt extended_glob
in Ihrem~/.zshrc
. Dann können Sie das Platzhaltermuster verwenden^one
, um das aufgerufene Verzeichnis auszuschließenone
.Wenn Sie eine Rekursion in Unterverzeichnisse durchführen möchten, verwenden Sie diese Option
**/
für rekursives Globbing. So schließen Sie dasone
auf der obersten Ebene aufgerufene Verzeichnis sowie das Verzeichnis auf der obersten Ebene aus:So schließen Sie Dateien in einem aufgerufenen Unterverzeichnis aus
one
, jedoch keine Dateien in dessen Unterverzeichnissen:one
Verwenden Sie ein Wiederholungsmuster mit dem#
Operator um die Negation, um Dateien in einem Unterverzeichnis auszuschließen, das auf einer beliebigen Ebene aufgerufen wird :quelle