Disons que vous avez list.txt
comme ceci :
file 1
file 2
file 3
Vous pouvez obtenir ce que vous voulez avec :
while read FILE; do touch "${FILE} some string"; done < list.txt
Vous avez donc un fichier list
qui contient :
this
that
the-other
et vous voulez créer, pour chaque ligne de ce fichier, un fichier avec le nom donné sur cette ligne. C'est assez simple - si et seulement si chaque ligne se compose d'un seul mot :
cat list | xargs touch --
(Le --
dit touch
ne pas essayer d'analyser quoi que ce soit après comme argument ; sans cela, si vous avez des noms de fichiers comme -this
, le premier -
confondra touch en pensant que 't', 'h', 'i' et 's' sont des arguments, plutôt que des parties du nom de fichier littéral à toucher.)
C'est le cas simple pris en charge, mais ce n'est pas ce que vous avez demandé; si vous voulez que le nom de fichier contienne du texte au-delà de ce qui est spécifié sur les lignes dans list
, les choses se compliquent; xargs ne peut pas faire ce genre d'interpolation. Au lieu de cela, vous auriez besoin de quelque chose comme ce qui suit (qui nécessite que votre shell soit bash
, comme c'est le cas sur la plupart des systèmes) :
for file in `cat list`; do touch -- $file-customtext; done
Attention, cela ne fonctionne toujours que si chaque ligne est constituée d'un seul mot. Dans cette commande, $file
est remplacé par le nom de fichier spécifié sur une ligne donnée dans list
; tout ce qui l'entoure est pris littéralement, donc cette commande avec le list
contenu ci-dessus créerait les fichiers suivants :
this-customtext
that-customtext
the-other-customtext
Vous pouvez remplacer '-customtext' par ce que vous voulez, bien sûr, et vous pouvez également avoir un préfixe ainsi qu'un suffixe ; si vous aviez plutôt do touch -- some-$file-text
, par exemple, cela fonctionnerait tout aussi bien et donnerait des fichiers nommés some-this-text
&c.
Maintenant, supposons que le contenu de list
ne sont pas si simples - en particulier, qu'ils contiennent des espaces, des caractères non verbaux ou d'autres éléments que le shell n'interprétera pas correctement. Si vous demandez à trois personnes ce qu'elles recommanderaient dans ce cas, vous obtiendrez probablement cinq réponses; Je suis un hacker Perl, donc ma réponse est Perl. Plus précisément, supposons un list
qui contient :
This is the first line
of three (three?) lines
in the list file.
La façon dont je procéderais serait :
cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'
Qui produit les fichiers résultants :
custom This is the first line text
custom of three (three?) lines text
custom in the list file. text
Le texte personnalisé dans ce cas peut être ce que vous voulez, espaces et tout, tant qu'il ne contient ni "
(ce qui confondra touch
) ni '
(ce qui confondra perl
); dans la commande Perl, $_
représente le contenu d'une ligne donnée de list
, et le texte personnalisé doit être avant ou après, mais entre guillemets doubles. (Le texte personnalisé en dehors des guillemets doubles sera considéré par touch
comme un nom de fichier séparé, qui sera littéralement créé à moins qu'il ne contienne quelque chose qui causera touch
à l'erreur.)