J'ai utilisé touch
pour la création unique de fichiers vides et de plusieurs fichiers vierges à partir d'une liste à l'aide de cat foo.txt | xargs touch
plus je me suis heurté à Comment créer plusieurs fichiers avec le terminal? mais je Je ne parviens pas à comprendre comment mettre en œuvre la création de fichiers utilisant un modèle à partir d'une liste de fichiers avec pure bash.
Noms de fichier dans le fichier foo.txt:
cpt-one.php
cpt-two.php
cpt-three.php
template.txt:
// lots of code
Est-il possible d'utiliser touch
pour créer le fichier à partir de la liste en utilisant le contenu de template.txt au lieu de créer un fichier vide?
Une façon de le faire bash
- (sans boucle explicite) peut être
lire les noms de fichiers dans une variable de tableau Shell
mapfile -t files < foo.txt
ou son synonyme readarray -t files < foo.txt
développer le tableau à l'intérieur d'une commande tee
tee < template.txt -- "${files[@]}" > /dev/null
[Le > /dev/null
est facultatif. Il masque simplement la sortie standard par défaut de tee
du terminal.]
Si vous ne devez pas créer des milliers de fichiers, vous pouvez utiliser l’extension d'accolade:
$> touch cpt-{one,two,three}.php
$> ls
cpt-one.php cpt-three.php cpt-two.php
Puisque votre objectif est de cloner un modèle, utilisez tee
pour rediriger stdin vers plusieurs fichiers. tee
écrit à la fois dans le fichier et dans la sortie standard, ainsi vous le verrez en écho sur le terminal
$> cat template.txt | tee cpt-{one,two,three}.php
I'm template
Alternativement, on pourrait utiliser la structure while read
. avec redirection de shell.
$> rm *
$> vi inputFile.txt
$> while read FILE; do touch "$FILE" ; done < inputFile.txt
$> ls
cpt-one cpt-three cpt-two inputFile.txt
Notez bien qu'il s'agit d'un exemple simple supposant que les entrées du fichier ne contiennent aucun caractère spécial.
Maintenant, puisque vous voulez réellement copier un fichier dans plusieurs fichiers, vous pouvez utiliser la même structure, pour cp /path/to/template "$FILE"
$> ls
inputFile.txt template.txt
$> cat template.txt
I'm template
$> while read FILE; do cp template.txt "$FILE" ; done < inputFile.txt
$> cat cpt-one.php
I'm template
$>