¿Cómo evitar el uso inútil de cat cuando se analiza un file?

Tengo un file que contiene una list de directorys. Por ejemplo

/foo/bar/dir1 /foo/bar/dir2 /foo/bar/dir3 

Quiero crear todos estos directorys. Esto es lo que hice:

 for dir in $(cat myfile); do mkdir $dir; done 

¿Cuál sería la forma correcta de hacer esto mientras se evita el "uso inútil del gato"?

Idealmente, las respuestas se centrarían en Ksh88, pero también estoy interesado en otras conchas

La sugerencia de AProgrammer de usar xargs suele ser la mejor, pero otra opción es usar la networkingirección en un ciclo while, que permite que se realicen commands adicionales y que se establezcan las variables:

 while read -r dir; do mkdir $dir; done < myfile 

Un ejemplo de una estructura más complicada sería:

 now=`date +%Y%m%d.%H%M%S` while read -r dir; do newdistfile="/tmp/dist-`echo $dir | tr / _`.tgz" mv $dir ~/backups/$dir.$now && mkdir $dir && tar xzfC $newdistfile $dir done < myfile 

Esto no es algo que xargs podría hacer sin escribir un 'progtwig de ayuda'.

Haría algo como

 xargs mkdir < myfile 

Al less en bash, siempre y cuando no haya nombres de file que contengan espacios y líneas nuevas, esto:

 mkdir $(< myfile) 

trabajos. Así que tenemos un uso inútil de for , xargs también.

<no inicia un nuevo process en bash, en contraste con cat , pero no sé por ksh .

Esta es la solución más cercana a su script original, evitando el gato inútil

 for dir in $(<myfile); do mkdir $dir; done 

Sin embargo, todavía contiene un bucle inútil.

No diría que es un uso inútil del gato.

En el sentido clásico , un UUOC significa escribir:

 cat file | some_command and its args ... 

en lugar de lo equivalente y más barato

 <file some_command and its args ... 

o (de manera equivalente y más clásica)

 some_command and its args ... < file 

En este caso:

 for dir in $(cat myfile); do mkdir $dir; done 

no hay ningún command en el que se esté cparsing la salida de cat .

Ciertamente hay alternativas que no usan cat . En particular, para bash y ksh $(<myfile) es probable que sea más rápido que $(cat myfile) , aunque no todas las shells admiten esa construcción. Pero no llamaría al código original "uso inútil del gato" más de lo que llamaría a la solución de AProgrammer un "uso inútil de xargs".

Con bash 4 y limitado por ARG_MAX

 mapfile -t <file && mkdir -- "${MAPFILE[@]}"