J'essayais de concaténer des fichiers texte dans des sous-dossiers et j'ai essayé:
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var
Mais cela n'a rien retourné. Donc, j'ai essayé d'ajouter un «sous-dossier2» inexistant
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var
Et cette fois, cela a fonctionné, concaténant les fichiers avec succès. Pourquoi cela se produit-il?
bash
cat
brace-expansion
CDPF
la source
la source
echo
au lieu decat
pour voir quelle ligne de commande vous avez obtenue. (Ou utilisezset -x
pour le débogage.)Réponses:
Par définition, l'expansion d'accolade dans GNU Bash nécessite soit une expression de séquence soit une série de valeurs séparées par des virgules:
Vous pouvez lire le manuel pour plus de détails.
Quelques exemples simples:
la source
{subfolder1}
évalue à{subfolder1}
, car il n'y a aucune alternative. Utilisezsubfolder1
plutôt.la source
csh
(d'où provient l'expansion de l'accolade),tcsh
oufish
.Les accolades ne se développent que si elles ont des chaînes séparées par un coma, par exemple {abc, def} ou plage, par exemple {a..e} spécifiées entre elles.
Dans votre cas, vous pouvez simplement écrire subfolder1 sans le placer entre accolades car cela n'est pas nécessaire
la source
/path/{a,}/filename
s'étend aux deux chaînes/path/a/filename
et/path//filename
, ce qui peut être indésirable.ambiguous redirect
si vous essayez de rediriger vers un fichier donné par une variable sans guillemets qui n'a pas de valeur, par exempleecho 'hello' >$idontexist
.> *.txt
avec plusieurs.txt
fichiers, ou> $file
s'il$file
contient des espaces. Mais bien sûr, il n'y a rien d'ambigu dans le fait de donnercat
plusieurs arguments