Digamos que tengo un archivo de texto como:
john
george
james
stewert
con cada nombre en una línea separada.
Quiero leer las líneas de este archivo de texto y crear un archivo de texto para cada nombre, como: john.txt, george.txtetc.
¿Cómo puedo hacer esto en Bash?
command-line
bash
levato
fuente
fuente

Respuestas:
# 1 usando Bash +
touch:while read line; [...]; done <in: Esto se ejecutareadhasta quereadregresa1, lo que sucede cuando se alcanza el final del archivo; la entrada parareadse lee desde un archivo nombradoinen el directorio de trabajo actual en lugar de desde el terminal debido a la<inredirección;touch "$line.txt": Esto se ejecutatouchen el valor expandido de$line.txt, que es el contenido delineseguido por.txt;touchcreará el archivo si no existe y actualizará su tiempo de acceso si existe;# 2 usando
xargs+touch:-a in: hacexargsleer su entrada de un archivo nombradoinen el directorio de trabajo actual;-I name: hacexargsreemplazar cada ocurrencia denamecon la línea de entrada actual en el siguiente comando;touch name: Se ejecutatouchen el valor reemplazado dename; creará el archivo si no existe y actualizará su tiempo de acceso si existe;fuente
read lineleerá realmente la línea? @kos<indespués dedonemarcasreaden lawhilecondición de bucle leer y almacenar una línea deinenlineen cada iteración; de esta manera,touch "$line.txt"dentro del bucle se expandirá a la línea de lectura.txtal final.while read line; do touch "$line.txt"; done <insolo hacer el trabajo? ¿Dónde está el archivo fuente?readfunciona. Verhelp read.En este caso particular, donde solo tiene una sola palabra por línea, también puede hacer:
Tenga en cuenta que esto se romperá si los nombres de sus archivos pueden contener espacios. Para tales casos, use esto en su lugar:
Solo por diversión, aquí hay un par de otros enfoques (los cuales pueden manejar nombres de archivos arbitrarios, incluidas líneas con espacios):
Perl
Awk
Tenga en cuenta que en Linux y sistemas similares, la extensión es opcional para la gran mayoría de los archivos. No hay razón para agregar una
.txtextensión a un archivo de texto. Usted es libre de hacerlo, pero no hace ninguna diferencia. Entonces, si desea la extensión de todos modos, use uno de:fuente
AWK también es apropiado para esta tarea:
Otra forma,
tee. Tenga en cuenta que este enfoque se romperá si una línea contiene más de una cadena en la lista de archivos.Alternativamente, también
</dev/null tee $(cat filelist)se puede hacer, si desea evitar las tuberíascp /dev/nullenfoque (como demuestro esto funciona con nombres de archivo que contienen espacios):fuente
echo "" | tee file1 file2 file2. Pero se rompe si los nombres de archivo contienen espacios.Digamos que tengo una respuesta ;)
Impermeable también con espacios y con sufijo =)
fuente