Ich muss alle Unterverzeichnisse eines Verzeichnisses auflisten, mit Ausnahme derjenigen, die mit einer Liste übereinstimmen, die als Argument angegeben wurde: "SUBDIR1, SUBDIR2, ..., SUBDIRN".
Ich kam mit der Lösung (aus vielen Quellen), ls mit einem Glob-Muster zu verwenden. Um das Konzept zu testen, habe ich in der Befehlszeile die folgende Sequenz ausprobiert, die zu funktionieren scheint:
DIR="/path/to/dirs"
EXCLUDELIST="subdir1,subdir2"
#transform in a glob pattern for excluding given subdirectories
EXCLUDE="!(${EXCLUDELIST//,/|})"
LIST=$(cd $DIR && ls -l -d $EXCLUDE | grep -E "(^d)" | awk '{print $9}')
Wenn ich es jedoch unverändert in ein Bash-Skript einfüge , wird dieser Fehler angezeigt
ls: cannot access !(subdir1|subdir2): No such file or directory
Was mache ich falsch, wenn ich diesen Code in das Skript einfüge?
quelle
Interaktive und nicht interaktive Bash-Shells verhalten sich nicht gleich. Einer der vielen Unterschiede besteht darin, dass die Shell-Option extglob standardmäßig für interaktive Shells aktiviert ist (zumindest in meiner Version von bash), jedoch nicht für nicht interaktive.
Aktivieren Sie extglob mit dem folgenden Befehl , um Ihr Skript zu reparieren :
quelle
ls -1 -d subdir3 subdir4 subdir5 ..... subdirn
wobei die Liste der Unterverzeichnisse die tatsächliche Erweiterung des Glob ist.#!/bin/bash
Skripten, jedoch nicht in#!/bin/sh
(was auf meinem RHEL6-System tatsächlich Bash ist, aber die Verwendung dieses Namens weist es an, ein anderes Verhalten zu verwenden). Mein Google-Fu versagt mir, ich kann den entsprechenden Bourne-Shell-Befehl nicht finden.