web-dev-qa-db-fra.com

Créez plusieurs fichiers à partir d’un modèle référençant un fichier txt unique et appuyez sur

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?

2

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.]

4
steeldriver

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
$> 
0
Sergiy Kolodyazhnyy