Ich hatte den Eindruck, dass es sicherer sein könnte, ./*.fastq
nach Dateien zu suchen, die mit enden .fastq
. Zum Beispiel ./
würde verhindern , dass die Datei erfassen .fastq
. Dies ist offensichtlich falsch, wie im folgenden Beispiel gezeigt:
TMP_DIR=$(mktemp --directory)
mkdir -p ${TMP_DIR}
(cd ${TMP_DIR}
touch {a,b,c,}.fastq
ls -a
echo ""
echo "# match all:"
for f in *.fastq ; do
echo "${f}"
done
echo ""
echo "# with ./:"
for f in ./*.fastq ; do
echo "${f}"
done
)
rm -rf ${TMP_DIR}
.
..
a.fastq
b.fastq
c.fastq
.fastq
# match all:
a.fastq
b.fastq
c.fastq
# with ./:
./a.fastq
./b.fastq
./c.fastq
Weder *.fastq
noch ./*.fastq
mit der Datei übereinstimmen .fastq
. Ich frage mich jetzt, ob es Sinn macht, ./*.fastq
hier oder ./*
allgemein etwas zu verwenden.
./*
ist, dass sichergestellt wird, dass Namen, die mit beginnen,-
nicht als Optionen behandelt werden.Antworten:
Das ist zunächst ein überraschendes Platzhalterverhalten, da die Beschreibung für das
*
Platzhalterzeichen lautet:... bis Sie feststellen, dass dieser Zeitraum etwas Besonderes ist, wenn es sich um das erste Zeichen eines Dateinamens handelt. Der Einführungstext in
3.5.8 Filename Expansion
sagt es:Das "Verwendungsmuster" des Präfixierens von Platzhaltern
./
ist nützlich, um Namen mit führendem Bindestrich in der Bash-Shell zu behandeln , wie steeldriver kommentierte. Dies hat keine Auswirkungen auf die Erweiterung des Platzhalters / Dateinamens, macht es jedoch sicherer / einfacher, mit den Dateinamen umzugehen, wenn Sie auf sie verweisen, wenn sie mit Zeichen beginnen, die diese Programme möglicherweise als Optionen falsch interpretieren. Beispielsweise:... und jetzt, wo ich habe eine Datei mit dem Namen
-n
, wenn ich eine Schleife über es mit einem Platzhalter passieren:... ich bekomme keine Ausgabe!
Aber wenn ich dem Platzhalter ein Präfix voranstelle
./
,... Ich sehe den Dateinamen.
Dies ist ein einfaches Beispiel für Demonstrationszwecke. siehe auch Warum ist printf besser als echo? aus diesem Grund und anderen. Andere Dienstprogramme werden durch andere Optionen ausgelöst, daher ist es besser, die Dateinamen den Dienstprogrammen so sicher wie möglich zu präsentieren. Wenn Sie dem Platzhalter kein "Escape" -Dateinamen voranstellen, müssen Sie Ihre Dienstprogramme auf andere Weise "schützen". Eine übliche Möglichkeit besteht darin, das Ende von Optionen zu signalisieren
--
, zum Beispiel mit:... die den
-n
Dateinamen sicher weitergebenmv
(wie unterset -x
)):quelle