Digamos que tienes list.txt
así:
file 1
file 2
file 3
Puedes lograr lo que quieras con:
while read FILE; do touch "${FILE} some string"; done < list.txt
Así que tienes un archivo list
que contiene:
this
that
the-other
y desea crear, para cada línea de ese archivo, un archivo con el nombre dado en esa línea. Eso es bastante fácil, si y solo si cada línea consta de una sola palabra:
cat list | xargs touch --
(El --
le dice a touch
no tratar de analizar nada después como un argumento; sin él, si tiene nombres de archivo como -this
, el líder -
confundirá tocar pensando que 't', 'h', 'i' y 's' son argumentos, en lugar de partes del nombre de archivo literal para tocar).
Ese es el caso simple resuelto, pero no es lo que pediste; si desea que el nombre del archivo contenga algo de texto más allá de lo especificado en las líneas en list
, las cosas se complican más; xargs no puede hacer ese tipo de interpolación. En su lugar, necesitaría algo como lo siguiente (que requiere que su shell sea bash
, como es estándar en la mayoría de los sistemas):
for file in `cat list`; do touch -- $file-customtext; done
Tenga en cuenta que esto solo funciona si cada línea consta de una sola palabra. En este comando, $file
se reemplaza por el nombre de archivo especificado en una línea dada en list
; todo lo que lo rodea se toma literalmente, por lo que este comando con el list
el contenido anterior crearía los siguientes archivos:
this-customtext
that-customtext
the-other-customtext
Puede reemplazar '-customtext' con lo que quiera, por supuesto, y también puede tener un prefijo y un sufijo; si en cambio tuvieras do touch -- some-$file-text
, por ejemplo, funcionaría igual de bien y daría como resultado archivos llamados some-this-text
&c.
Ahora bien, suponiendo que el contenido de list
no son tan simples, específicamente, que contienen espacios, caracteres que no son palabras u otras cosas que el shell no interpretará correctamente. Si le preguntas a tres personas qué recomendarían en este caso, probablemente obtendrás cinco respuestas; Soy un hacker de Perl, así que mi respuesta es Perl. Específicamente, supongamos un list
que contiene:
This is the first line
of three (three?) lines
in the list file.
La forma en que haría esto sería:
cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'
Lo que produce los archivos resultantes:
custom This is the first line text
custom of three (three?) lines text
custom in the list file. text
El texto personalizado en este caso puede ser lo que quieras, espacios y todo, siempre que no contenga "
(que confundirá a touch
) ni '
(lo que confundirá a perl
); en el comando Perl, $_
representa el contenido de una línea dada de list
, y el texto personalizado debe estar antes o después, pero entre comillas dobles. (El texto personalizado fuera de las comillas dobles será considerado por touch
como un nombre de archivo separado, que se creará literalmente a menos que contenga algo que cause touch
a error.)