Crie uma lista de diretórios

Crie uma lista de diretórios

Eu tenho uma lista de nomes em um arquivo de texto ( list.txt). Quero criar uma lista de pastas para os nomes incluídos nesse arquivo. Escrevi o seguinte script, mas não funciona e não sei o que há de errado:

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

O arquivo list.txte os scripts estão na mesma pasta.

Responder1

Isso funcionou para mim:

xargs mkdir <list.txt

Isso funciona porque se você fornecer vários argumentos, mkdirele criará com prazer todos os diretórios que puder criar. xargssimplesmente "achata" seu arquivo de texto, substituindo novas linhas por espaços, invocando assim mkdiruma longa lista de argumentos contendo todos os nomes de diretórios de uma vez, em vez de um de cada vez.

Se você quiser adicionar um prefixo fixo (ou sufixo, ou ambos):

xargs -I, mkdir prefix_, <list.txt

Tudo o que você colocar após a -Iopção (uma vírgula neste caso) será substituído pelo nome que é lido no arquivo.

Mais uma coisa, eu adicionaria aspas caso os nomes dos arquivos em seu arquivo de texto contenham espaços ou outros caracteres "especiais":

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

ou

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

Responder2

No seu exemplo, seus confusos comandos de script de shell. Você deve prestar atenção especial à linguagem de script que está usando e, em seguida, aderir à sintaxe de seus comandos. No seu exemplo, você está usando o shell turbo C (tcsh), mas está misturando comandos e sintaxes do shell Bash/Bourne.

Você pode usar a seguinte abordagem se realmente quiser tcsh. Digamos que eu tenha este arquivo de amostra:

$ cat afile 
1
2
3
4
5

E este roteiro:

$ cat cmd.csh 
#!/bin/tcsh

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

Executá-lo produzirá esta saída:

$ ./cmd.csh
1
2
3
4
5

Portanto, para completar a tarefa, podemos adicionar o mkdircomando após echo:

$ cat cmd1.csh 
#!/bin/tcsh

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

Agora, quando o executamos:

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

Resultando na criação dos diretórios:

$ 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

Responder3

Se você possui o GNU Parallel, você pode fazer:

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

Ao contrário de xargs, ele lida corretamente com caracteres especiais - como <, >, ', "e espaço.

GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas às quais você tem acesso ssh.

Instalação

Se o GNU Parallel não estiver empacotado para sua distribuição, você poderá fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos fazendo o seguinte:

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

Para outras opções de instalação consultehttp://git.savannah.gnu.org/cgit/parallel.git/tree/README

Saber mais

Veja mais exemplos:http://www.gnu.org/software/parallel/man.html

Assista aos vídeos de introdução:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Percorra o tutorial:http://www.gnu.org/software/parallel/parallel_tutorial.html

Inscreva-se na lista de e-mail para obter suporte:https://lists.gnu.org/mailman/listinfo/parallel

Responder4

Você não precisa de um loop. Você pode fazer:

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

informação relacionada