GNU/Linux >> Tutoriels Linux >  >> Linux

Comment créer des fichiers nommés d'après des lignes dans un fichier texte sous Linux

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


Linux
  1. Comment créer un swap sous Linux

  2. Comment créer un fichier d'échange sous Linux

  3. Créer des fichiers en utilisant la ligne de commande sous Linux

  4. Comment créer des fichiers fragmentés sous Linux à l'aide de la commande "dd"

  5. Comment tar, décompresser des fichiers et afficher le contenu du fichier tar sous Linux

Comment renommer un ou plusieurs fichiers sous Linux

Comment créer des répertoires à partir d'un fichier texte sous Linux

Comment imprimer des lignes dupliquées dans un fichier texte sous Linux

Comment trouver des fichiers contenant une chaîne de texte spécifique sous Linux

Comment compresser un fichier sous Linux

Comment créer un fichier zip ou des répertoires protégés par mot de passe sous Linux