Disons que j'ai un fichier texte comme:
john
george
james
stewert
avec chaque nom sur une ligne distincte.
Je veux lire les lignes de ce fichier texte et créer un fichier texte pour chaque nom, comme: john.txt
, george.txt
etc.
Comment puis-je faire cela dans Bash?
command-line
bash
levato
la source
la source
Réponses:
# 1 Utiliser Bash +
touch
:while read line; [...]; done <in
: Cela s'exécuteread
jusqu'à ce queread
lui-même revienne1
, ce qui se produit lorsque la fin du fichier est atteinte; l'entrée pourread
est lue à partir d'un fichier nomméin
dans le répertoire de travail actuel au lieu du terminal en raison de la<in
redirection;touch "$line.txt"
: Cela s'exécutetouch
sur la valeur étendue de$line.txt
, qui est le contenu deline
suivi de.txt
;touch
créera le fichier s'il n'est pas existant et mettra à jour son temps d'accès s'il existe;# 2 Utiliser
xargs
+touch
:-a in
: faitxargs
lire son entrée depuis un fichier nomméin
dans le répertoire de travail courant;-I name
: faitxargs
remplacer chaque occurrence dename
par la ligne d'entrée actuelle dans la commande suivante;touch name
: S'exécutetouch
sur la valeur remplacée dename
; il créera le fichier s'il n'est pas existant et mettra à jour son temps d'accès s'il existe;la source
read line
réellement lire la ligne? @kos<in
aprèsdone
marquesread
dans lawhile
condition de boucle lire et stocker une ligne à partirin
deline
chaque itération; de cette façon, l'touch "$line.txt"
intérieur de la boucle sera étendu à la ligne de lecture avec.txt
à la fin.while read line; do touch "$line.txt"; done <in
seul le travail? Où est le fichier source?read
marche. Tu voishelp read
.Dans ce cas particulier, où vous n'avez qu'un seul mot par ligne, vous pouvez également faire:
Notez que cela se cassera si vos noms de fichiers peuvent contenir des espaces. Pour de tels cas, utilisez ceci à la place:
Juste pour le plaisir, voici quelques autres approches (qui peuvent toutes deux gérer des noms de fichiers arbitraires, y compris des lignes avec des espaces):
Perl
Awk
Notez que sur Linux et les systèmes similaires, l'extension est facultative pour la grande majorité des fichiers. Il n'y a aucune raison d'ajouter une
.txt
extension à un fichier texte. Vous êtes libre de le faire, mais cela ne fait aucune différence. Donc, si vous voulez quand même l'extension, utilisez l'une des options suivantes:la source
AWK est également approprié pour cette tâche:
Une autre façon,
tee
. Notez que cette approche se cassera si une ligne contient plusieurs chaînes dans la liste de fichiers.Alternativement, cela
</dev/null tee $(cat filelist)
peut être fait aussi, si vous voulez éviter la tuyauteriecp /dev/null
approche (comme je le démontre, cela fonctionne avec les noms de fichiers qui contiennent des espaces):la source
echo "" | tee file1 file2 file2
. Mais il se casse si les noms de fichiers contiennent des espaces.Disons que j'ai une réponse ;)
Etanche aussi avec des espaces et avec un suffixe =)
la source