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.txt
etc.
¿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 ejecutaread
hasta queread
regresa1
, lo que sucede cuando se alcanza el final del archivo; la entrada pararead
se lee desde un archivo nombradoin
en el directorio de trabajo actual en lugar de desde el terminal debido a la<in
redirección;touch "$line.txt"
: Esto se ejecutatouch
en el valor expandido de$line.txt
, que es el contenido deline
seguido por.txt
;touch
creará el archivo si no existe y actualizará su tiempo de acceso si existe;# 2 usando
xargs
+touch
:-a in
: hacexargs
leer su entrada de un archivo nombradoin
en el directorio de trabajo actual;-I name
: hacexargs
reemplazar cada ocurrencia dename
con la línea de entrada actual en el siguiente comando;touch name
: Se ejecutatouch
en el valor reemplazado dename
; creará el archivo si no existe y actualizará su tiempo de acceso si existe;fuente
read line
leerá realmente la línea? @kos<in
después dedone
marcasread
en lawhile
condición de bucle leer y almacenar una línea dein
enline
en cada iteración; de esta manera,touch "$line.txt"
dentro del bucle se expandirá a la línea de lectura.txt
al final.while read line; do touch "$line.txt"; done <in
solo hacer el trabajo? ¿Dónde está el archivo fuente?read
funciona. 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
.txt
extensió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/null
enfoque (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