Ler vários arquivos dentro de um diretório

1. Ler vários arquivos dentro de um diretório

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 11/06/2013 - 10:06h

Fala galera,
estou com um problema e não consigo resolver, talvez vcs possam me ajudar. Dado um diretório (/home/user/diretorio/*) quero ler todos os arquivos que estão lá dentro, lembrando que o nome dos documentos não seguem uma ordem, são nomes aleatórios, com nomes sequenciais consigo fazer. Qualquer ajuda é bem-vinda pessoal. Abç.


  


2. Ler vários arquivos dentro de um diretório

Daniel Zaia Manzano
dzm_linux

(usa Debian)

Enviado em 11/06/2013 - 13:02h

Amigo,

Escrevi um script bem simples que talvez te ajude:

$ vim dir.sh


#!/bin/bash
cat $1/*


$ chmod +x dir.sh
$ ./dir.sh diretorio_teste

Ele mostrará na tela o conteúdo de todos os arquivos dentro do "diretorio_teste"

Abraços


3. Re: Ler vários arquivos dentro de um diretório

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 11/06/2013 - 13:14h

dzm_linux escreveu:

Amigo,

Escrevi um script bem simples que talvez te ajude:

$ vim dir.sh


#!/bin/bash
cat $1/*


$ chmod +x dir.sh
$ ./dir.sh diretorio_teste

Ele mostrará na tela o conteúdo de todos os arquivos dentro do "diretorio_teste"

Abraços


Funciona, mas da forma que está não desce aos subdiretórios. Se for esse o interesse, o comando
 $ find /diretorio/a/ser/lido -name "*" -print0 | xargs -0 cat 

Com isso nem precisa de script ;-)


4. Ler vários arquivos dentro de um diretório

Daniel Zaia Manzano
dzm_linux

(usa Debian)

Enviado em 11/06/2013 - 13:30h

Diga-se de passagem

$ man xargs

...
-0 Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
...


Abraços



5. Re: Ler vários arquivos dentro de um diretório

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 11/06/2013 - 13:45h

dzm_linux escreveu:

Diga-se de passagem

$ man xargs

...
-0 Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
...


Abraços


Argumento necessário caso ele tenha um arquivo do tipo "a velha que o trem matou morreu.txt" (com as aspas) ;-)


6. Dúvida

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 11/06/2013 - 14:57h

Galera, não soube me expressar direito, eu quero fazer um laço de repetição (for ou while) entre todos os arquivos do diretório e pra cada arquivo crie uma tabela hash...Mais ou menos assim

while (existir arquivos no diretorio) {
leia o primeiro arquivo
grava esse arquivo numa tabela hash
}

As funções de add na tabela hash eu já tenho, o problema é so a condição de parada do laço e criar uma tabela hash pra cada arquivo...


7. Re: Ler vários arquivos dentro de um diretório

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 12/06/2013 - 10:55h

ramiro99 escreveu:

Galera, não soube me expressar direito, eu quero fazer um laço de repetição (for ou while) entre todos os arquivos do diretório e pra cada arquivo crie uma tabela hash...Mais ou menos assim

while (existir arquivos no diretorio) {
leia o primeiro arquivo
grava esse arquivo numa tabela hash
}

As funções de add na tabela hash eu já tenho, o problema é so a condição de parada do laço e criar uma tabela hash pra cada arquivo...


Você não precisa do loop while, use o próprio comando find pra isso
 $ find /diretorio/a/ser/lido -name "*" -print0 | xargs -0 "coloque sua função aqui" 

Sério, você realmente precisa estudar shell script. O combo find + xargs serve exatamente pra isso, pra executar comandos com todos os arquivos encontrados.


8. Ler vários arquivos dentro de um diretório

Daniel Zaia Manzano
dzm_linux

(usa Debian)

Enviado em 12/06/2013 - 12:00h

Amigos,

Se não me engano, ao invés de usar o xargs, podemos usar o parâmetro "-exec" do próprio "find":

Ex.
Conseguimos os mesmos resultados disso:
 $ find /diretorio/a/ser/lido -name "*" -print0 | xargs -0 "coloque sua função aqui" 


Com isso:

$ find /diretorio/a/ser/lido -name "*" -exec "coloque sua função aqui" '{}' \;


Para mais informações, consulte:
$ man find

Abraços






9. Re: Ler vários arquivos dentro de um diretório

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 12/06/2013 - 12:04h

dzm_linux escreveu:

Amigos,

Se não me engano, ao invés de usar o xargs, podemos usar o parâmetro "-exec" do próprio "find":

Ex.
Conseguimos os mesmos resultados disso:
 $ find /diretorio/a/ser/lido -name "*" -print0 | xargs -0 "coloque sua função aqui" 


Com isso:

$ find /diretorio/a/ser/lido -name "*" -exec "coloque sua função aqui" '{}' \;


Para mais informações, consulte:
$ man find

Abraços





Tem esse jeito também, que fica mais simples e tudo mais. Bem lembrado!


10. Re: Ler vários arquivos dentro de um diretório

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/06/2013 - 16:16h

O "-exec" é mais simples mas é mais caro: para cada arquivo encontrado, ele vai executar uma vez o comando externo. Se houver cem mil arquivos no diretório, serão criados, um de cada vez, cem mil processos, que vão disparar cem mil execuções sequenciais do mesmo comando externo.

Às vezes isso é o melhor que dá para fazer, mas frequentemente usar xargs é possível e é mais eficiente. Tomando o exemplo hipotético do diretório com cem mil arquivos que deveriam ser processados com alguma coisa (um grep, por exemplo), eu garanto que seria mais eficiente executar o grep mil vezes, cada uma delas recebendo cem arquivos como argumentos, do que cem mil vezes, cada uma delas com apenas um arquivo.


11. Ler vários arquivos dentro de um diretório

Daniel Zaia Manzano
dzm_linux

(usa Debian)

Enviado em 12/06/2013 - 19:20h

paulo1205 escreveu:

O "-exec" é mais simples mas é mais caro: para cada arquivo encontrado, ele vai executar uma vez o comando externo. Se houver cem mil arquivos no diretório, serão criados, um de cada vez, cem mil processos, que vão disparar cem mil execuções sequenciais do mesmo comando externo.

Às vezes isso é o melhor que dá para fazer, mas frequentemente usar xargs é possível e é mais eficiente. Tomando o exemplo hipotético do diretório com cem mil arquivos que deveriam ser processados com alguma coisa (um grep, por exemplo), eu garanto que seria mais eficiente executar o grep mil vezes, cada uma delas recebendo cem arquivos como argumentos, do que cem mil vezes, cada uma delas com apenas um arquivo.


De acordo com a explicação acima, deduz-se que se forem poucos arquivos no total, usar o parâmetro "-exec" do "find" se faz mais simples. Porém, se a quantidade de arquivos for muito grande, já é mais interessante usar o "xargs" junto com o "find".

Aprendizado constante.

Abraços








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts