Crear una lista de directorios

Crear una lista de directorios

Tengo una lista de nombres en un archivo de texto ( list.txt). Quiero crear una lista de carpetas para los nombres incluidos en ese archivo. Escribí el siguiente script, pero no funciona y no sé qué está mal:

#!/bin/tcsh
for name_id in `cat <path to list.txt>/list.txt` ; do
mkdir <name_id>${name_id}

El archivo list.txty los scripts están en la misma carpeta.

Respuesta1

Esto funcionó para mí:

xargs mkdir <list.txt

Esto funciona porque si le das múltiples argumentos, mkdirfelizmente creará todos los directorios que pueda crear. xargssimplemente "aplana" su archivo de texto reemplazando las nuevas líneas con espacios, invocando así mkdiruna larga lista de argumentos que contienen todos los nombres de su directorio a la vez en lugar de uno a la vez.

Si desea agregar un prefijo fijo (o sufijo, o ambos):

xargs -I, mkdir prefix_, <list.txt

Lo que pongas después del -Icambio (una coma en este caso) se reemplaza por el nombre que se lee del archivo.

Una cosa más, agregaría comillas en caso de que los nombres de los archivos en su archivo de texto tengan espacios u otros caracteres "especiales":

xargs -I, mkdir "," <list.txt

o

xargs -I, mkdir "prefix_," <list.txt

Respuesta2

En su ejemplo, sus confusos comandos de secuencias de comandos de Shell. Debe prestar especial atención al lenguaje de secuencias de comandos que está utilizando y luego cumplir con la sintaxis de sus comandos. En su ejemplo, está usando turbo C shell (tcsh), sin embargo, luego está mezclando comandos y sintaxis de Bash/Bourne Shell.

Puede utilizar el siguiente enfoque si realmente lo desea tcsh. Digamos que tenía este archivo de muestra:

$ cat afile 
1
2
3
4
5

Y este guión:

$ cat cmd.csh 
#!/bin/tcsh

foreach i (`cat afile`) 
  echo "$i" 
end

Al ejecutarlo se producirá este resultado:

$ ./cmd.csh
1
2
3
4
5

Entonces, para completar la tarea, podemos agregar el mkdircomando después de echo:

$ cat cmd1.csh 
#!/bin/tcsh

foreach i (`cat afile`) 
  echo "making directory: $i" 
  mkdir "$i"
end

Ahora cuando lo ejecutamos:

$ ./cmd1.csh 
making directory: 1
making directory: 2
making directory: 3
making directory: 4
making directory: 5

Resultando en la creación de los directorios:

$ ls -l
total 32
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 1
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 2
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 3
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 4
drwxrwxr-x. 2 saml saml 4096 Oct 16 18:58 5
-rw-rw-r--. 1 saml saml   11 Oct 16 18:47 afile
-rwxrwxr-x. 1 saml saml   86 Oct 16 18:56 cmd1.csh
-rwxrwxr-x. 1 saml saml   55 Oct 16 18:51 cmd.csh

Respuesta3

Si tienes GNU Parallel puedes hacer:

parallel -q mkdir '<name_id>'{} < list.txt 

Frente a xargs, trata correctamente los caracteres especiales, como <, >, ', " y el espacio.

GNU Parallel es un paralelizador general y facilita la ejecución de trabajos en paralelo en la misma máquina o en varias máquinas a las que tiene acceso ssh.

Instalación

Si GNU Parallel no está empaquetado para su distribución, puede realizar una instalación personal, que no requiere acceso de root. Se puede hacer en 10 segundos haciendo esto:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para otras opciones de instalación consultehttp://git.savannah.gnu.org/cgit/parallel.git/tree/README

Aprende más

Ver más ejemplos:http://www.gnu.org/software/parallel/man.html

Mira los vídeos de introducción:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Sigue el tutorial:http://www.gnu.org/software/parallel/parallel_tutorial.html

Regístrese en la lista de correo electrónico para obtener ayuda:https://lists.gnu.org/mailman/listinfo/parallel

Respuesta4

No necesitas un bucle. Tu puedes hacer:

mkdir `sed 's/^/<name_id>/' <path to list.txt>/list.txt`

información relacionada