Crie uma lista de diretórios

1

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

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

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

    
por slm 17.10.2014 / 00:06

4 respostas

0

Isso funcionou para mim:

xargs mkdir <list.txt

Isso funciona porque, se você fornecer vários argumentos para mkdir , ele criará todos os diretórios que pode criar. xargs "simplifica" seu arquivo de texto substituindo novas linhas por espaços, invocando mkdir com uma longa lista de argumentos contendo todos os seus nomes de diretório ao mesmo tempo, em vez de um por vez.

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

xargs -I, mkdir prefix_, <list.txt

Tudo o que você colocar depois da opção -I (uma vírgula neste caso) é substituído pelo nome que é lido do arquivo.

Mais uma coisa, gostaria de adicionar aspas apenas no caso de os nomes de arquivo em seu arquivo de texto possuírem espaços neles ou outros caracteres "especiais":

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

ou

xargs -I, mkdir "prefix_," <list.txt
    
por 17.10.2014 / 07:55
1

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

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

$ cat afile 
1
2
3
4
5

E este script:

$ cat cmd.csh 
#!/bin/tcsh

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

A execução produzirá esta saída:

$ ./cmd.csh
1
2
3
4
5

Para concluir a tarefa, podemos adicionar o comando mkdir após o echo :

$ cat cmd1.csh 
#!/bin/tcsh

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

Agora, quando executamos:

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

Resultando nos diretórios sendo criados:

$ 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
    
por 17.10.2014 / 00:52
1

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

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

Em frente ao xargs, ele lida corretamente com caracteres especiais - como & lt ;, & gt ;, ', "e espaço.

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 para as quais você tem acesso ssh.

Instalação

Se o GNU Parallel não for 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 ao fazer isso:

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

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 03.11.2014 / 16:17
0

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

mkdir 'sed 's/^/<name_id>/' <path to list.txt>/list.txt'
    
por 17.10.2014 / 00:13