Ich habe versucht, Textdateien in Unterordnern zu verketten und habe versucht:
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var
Dies brachte jedoch nichts zurück. Also, versucht einen nicht existierenden 'Unterordner2' hinzuzufügen
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var
Und dieses Mal hat es geklappt und die Dateien erfolgreich verkettet. Warum passiert das?
bash
cat
brace-expansion
CDPF
quelle
quelle
echo
anstelle von, umcat
zu sehen, welche Befehlszeile Sie haben. (Oderset -x
zum Debuggen verwenden.)Antworten:
Per Definition erfordert die geschweifte Klammer in GNU Bash entweder einen Sequenzausdruck oder eine Reihe von durch Kommas getrennten Werten:
Sie können das Handbuch für Details lesen .
Einige einfache Beispiele:
quelle
{subfolder1}
bewertet zu{subfolder1}
, da es keine alternativen gibt. Verwenden Siesubfolder1
stattdessen.quelle
csh
(woher die Klammererweiterung stammt)tcsh
oder unterscheidetfish
.Klammern werden nur dann erweitert, wenn zwischen ihnen durch Kommas getrennte Zeichenfolgen (z. B. {abc, def} oder range) angegeben sind.
In Ihrem Fall können Sie einfach Unterordner1 schreiben, ohne ihn in geschweifte Klammern zu setzen, da dies nicht erforderlich ist
quelle
/path/{a,}/filename
sich leider auf die beiden Saiten aus/path/a/filename
und/path//filename
kann das unerwünscht sein.ambiguous redirect
wenn Sie versuchen, in eine Datei umzuleiten, die von einer nicht in Anführungszeichen gesetzten Variablen angegeben wird, die keinen Wert hat, zecho 'hello' >$idontexist
.> *.txt
bei mehreren.txt
Dateien, oder> $file
wenn$file
Leerzeichen enthält. Aber es ist natürlich nicht zweideutig,cat
mehrere Argumente