
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.txt
e 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, mkdir
ele criará com prazer todos os diretórios que puder criar. xargs
simplesmente "achata" seu arquivo de texto, substituindo novas linhas por espaços, invocando assim mkdir
uma 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 -I
opçã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 mkdir
comando 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`