Ich benötige mein Skript, um mit jeder Datei im aktuellen Verzeichnis etwas zu tun, mit Ausnahme von Unterverzeichnissen.
Im aktuellen Pfad befinden sich beispielsweise 5 Dateien, von denen eine ein Ordner (ein Unterverzeichnis) ist. Mein Skript sollte einen Befehl aktivieren, der beim Ausführen des Skripts als Argumente angegeben wird. Das heißt, "bash script wc -w" sollte die Wortanzahl jeder Datei im aktuellen Verzeichnis angeben, jedoch keinen der Ordner, damit die Ausgabe niemals eine der Zeilen "/ sub / dir: Is a directory" enthält.
Mein aktuelles Skript:
#!/bin/bash
dir=`pwd`
for file in $dir/*
do
$* $file
done
Ich muss nur Verzeichnisse für die Schleife ausschließen, aber ich weiß nicht wie.
if [ -f "$file" ]; then ...
. Kein Verzeichnis würde nicht nur reguläre Dateien, sondern auch Sockets und Symlinks zurückgeben.! -d
bereits enthalten.Hier ist eine Alternative zur Verwendung einer for-Schleife, wenn dies einfach ist (und keine Variablen in der Haupt-Shell & c festgelegt werden müssen).
Sie können
find
mit-exec
und verwenden-maxdepth 1
, um ein erneutes Rekursieren in das Unterverzeichnis zu vermeiden.Dies
[ -n "$1" ]
dient dazu, die Ausführung aller Dateien im Verzeichnis zu vermeiden, wenn dem Skript keine Argumente übergeben werden.quelle
In zsh können Sie Glob-Qualifizierer verwenden , um Platzhalterübereinstimmungen nach Dateityp einzuschränken. Wenn Sie
(.)
das Muster beispielsweise hinzufügen , wird es auf reguläre Dateien beschränkt.Um mit Dateinamen umzugehen, die mit
-
oder beginnen.
, verwenden Siewc -c -- *(.N)
oderwc -c ./*(.N)
. Wenn Sie auch symbolische Links zu regulären Dateien einfügen möchten, machen Sie das*(-.)
.Die anderen gängigen Shells verfügen nicht über eine solche Funktion. Sie müssen daher einen anderen Mechanismus zum Filtern nach Dateien verwenden, z. B. das Testen von Dateitypen in einer Schleife oder
find
.quelle
Bash für Schleife ohne Unterverzeichnisse ('/') und Links (@):
quelle