In der Bash verwende ich oft for-Schleifen wie die folgenden
for file in *.type; do
sommecommand "$file";
done;
um eine Operation für alle passenden Dateien durchzuführen *.type
. Wenn in den Arbeitsverzeichnissen keine Datei mit dieser Endung gefunden wird, wird der Stern nicht erweitert und normalerweise erhalte ich eine Fehlermeldung, dass die Datei nicht gefunden wurde. Ich kann mir sofort mehrere Möglichkeiten vorstellen, um diesen Fehler zu vermeiden. Das Hinzufügen einer Bedingung scheint jedoch nicht sehr elegant zu sein. Gibt es einen kurzen und sauberen Weg, um dies zu erreichen?
*.txt
. Es lohnt sich zu prüfen, ob die Datei existiert.break
anstelle voncontinue
).In bash können Sie es verwenden
shopt -s nullglob
, um ein leeres Array zu erstellen, wenn keine Übereinstimmungen vorliegen.In POSIX-Shells ohne
nullglob
können Sie dieses Problem vermeiden, indem Sie überprüfen, ob der übergebene Dateiname tatsächlich vorhanden ist, indem Sie[ -e "$file" ] || [ -L "$file" ] || continue
als ersten Teil Ihrerfor
Schleife angeben.quelle
[ -e
wäre, da dies bei nicht zugreifbaren Dateien oder bei Dateien, die symbolisch mit nicht zugreifbaren oder nicht vorhandenen Dateien verknüpft sind, den Wert false zurückgibt.chmod 0 the_file
,[ -e the_file ]
wertet immer noch wahr, so ist es etwas anderes sein muss.mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]
. x / a ist nicht zugänglich, aber da x lesbar ist, wird x / * erweitert.Die übliche Technik für Muscheln, die keine
nullglob
Option haben, istDas Besondere
[*].type
ist, den Fall abzudecken,*.type
in dem im aktuellen Verzeichnis eine Datei aufgerufen wird .Wenn Sie nun Punktdateien einbinden möchten , wird dies komplizierter .
Ich glaube, diese Technik wurde vor ein paar Jahren von Laura Fairhead am Usenet geprägt.
quelle
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
Dadurch werden die
for
Schleife und das Globen der Shell vollständig aus der Gleichung entfernt.find
führt den-exec
Befehl einmal pro Match aus, und wenn es keine Matches gibt, wird er niemals ausgeführt. Die-maxdepth 0
Instruktionen finden, dass sie nicht in Unterverzeichnisse des genannten path-Arguments (.
in diesem Fall) zurückkehren.Der Nachteil ist, dass es sich um eine andere Anwendung handelt, die jedoch auf praktisch jedem Linux-System (und wahrscheinlich auch auf den meisten Unix-Systemen) vorhanden ist.
quelle