Ajuda na reconstrução da minh'alma.

1. Ajuda na reconstrução da minh'alma.

Hiboµ, the Owl
Hiboµ

(usa Nenhuma)

Enviado em 11/02/2017 - 22:55h

Senhores,

Eu tenho uma estrutura de diretório restaurada com o maravilhoso programa photorec, que está mais ou menos assim.

recup_dir.1 ... recup_dir.1021


Segundo este mesmo programa, até agora tenho em em total cerca de 334.448 arquivos em txt. Dito isto, eu tenho aproximadamente 80~10 arquivos neste formato que me são deveras importantíssimos (Poesias e notas de autoria própria).
Esqueci de mencionar que os arquivos estão dispostos de maneira aleatória nestes diretórios de maneira que podem existir dois arquivos que desejo resgatar, no diretório recup_dir.4. Nenhum no recup_dir.9 e mais alguns por exemplo em recup_dir.832. Outro problema, o nome destes arquivos são sequencias de números e letras em significado evidente.

O comando abaixo leva uma eternidade para vasculhar todos os diretórios, e imaginem que estou usando uma máquina que é um Atom64 com 2GB de RAM. Sim, rodando um live-usb ainda por cima ( é forte esse Linux, hein?). Eis o comando:

grep -R "palavra" /pastapai/recup_dir.*/*.txt  


Então eu pensei em primeiro filtrar todos os arquivos txt de todas estas pastas, colocar eles em uma outra separada, e aqui gostaria de fazer uma pergunta. Geralmente usando o comando cp eu sei que consigo copiar um arquivo de um destino para outro, mas gostaria de recortá-lo neste caso, a fim de consumir menos espaço em disco. Alguém poderia me explicar como utilizo isso junto ao comando cp, ou qualquer outro comando que seja?

Voltando.

A nível de organização, acredito que seja melhor criar um outro script, que vai ser parecido com este acima ( o do grep). O jeito que eu consigo imaginar esse script é pedir ao usuário uma palavra, e setar a busca nesse novo diretório onde há apenas os arquivos txt, listar os arquivos e no caso de existir dois ou mais arquivos com a mesma palavra sejam criados arquivos com nomes distintos para cada arquivo. Um pequeno exemplo.

ff31231239.txt
"batatinha quando nasce se esparrama pelo chão
a rosinha quando chora, é por falta de emoção"

ff312365463.txt
"De quando em quando me pego pensando nela
a cidade chora em memória, já dizia ela"

Ambos arquivos tem palavras como "quando" e "chora".

Onde eu setasse que a palavra a ser buscada entre os arquivos deveria ser "quando", estes dois arquivos fossem renomeados respectivamente para -> poesia01.txt, poesia02.txt.

Só de explicar eu já imagino que deve ser um inferno escrever algo assim, ou no mínimo para quem nunca escreveu script nenhum. Quero deixar claro que não estou pedindo para ninguém fazer o script para mim ( ainda que agradecesse muito, caso o ocorresse, pois preciso dessas poesias para uma feira da cidade). O que peço são nortes para poder recuperar esse material que é muito importante para mim.

A todos que se derem ao trabalho de ler, vos agradeço muito.


  


2. Re: Ajuda na reconstrução da minh'alma.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/02/2017 - 15:29h

Qual o espaço total ocupado por esses mais de trezentos mil arquivos txt?

Eu ficaria tentado a montar dois mapas, word2files e file2words, que, como os nomes indicam, podem chegar aos nomes de arquivos contendo determinadas palavras ou às palavras contidas em determinados arquivos. O problema com isso é que esses mapas tenderiam a aproximadamente duplicar (ou triplicar) o tamanho total dos arquivos.

Quando o conjunto de dados é relativamente pequeno, eu costumo montar mapas assim em RAM. Se for grande (aproximadamente da mesma ordem que a RAM ou maior que ela), você teria de usar um banco de dados em disco (e aí você poderia questionar se valeria a pena trocar busca em disco por busca em disco, e a resposta seria que sim, se a solução de banco contar com índices que agilitem uma busca, e também com algoritmos de cache, em vez de fazer e refazer buscas meramente sequenciais, que é o jeito como trabalha o grep).

Para esse tipo de coisa, eu costumo preferir Perl ao shell. Além de ser geralmente mais eficiente (veja, por exemplo, as mensagens 7 e 9 do tópico https://www.vivaolinux.com.br/topico/Shell-Script/Como-criar-um-script-para-localizar-varias-palavra...), ele tem meios de associar diretamente seus arrays associativos com back-ends de bancos de dados, através da função tie da linguagem, que facilitariam uma eventual migração para um conjunto de dados muito grande para disco, em vez de RAM.

O script abaixo mostra mais ou menos como se poderiam montar os mapas mencionados acima em Perl.

#!/usr/bin/perl

# Para permitir trabalhar com caracteres acentuados.
use locale ':not_characters';
use open ':locale';
use POSIX;
setlocale(LC_ALL, "");

if(!open(FIND_OUTPUT, "-|", "find", "/diretorio/a/ser/varrido", "-type", "f", "-iname", "*.txt")){
die("nao foi possível executar o comando find: $!.\n");
}
while(defined($file=<FIND_OUTPUT>)){
chomp($file);
if(!open(FILE, "<", $file)){
warn("nao foi possível abrir arquivo \"$file\": $!. Ignorando.\n");
next;
}
while(defined($line=<FILE>)){
chomp($line);
while($line=~/\b(\w+)\b(.*)/){
$line=$2;
$word=lc($1); # Converte para minúsculas ao montar os dicionários.
$word2files{$word}{$file}=1;
$file2words{$file}{$word}=1;
}
}
close(FILE);
}
close(FIND_OUTPUT);

# Neste ponto, os dois mapas estão montados em memória (ou
# em disco, se você tiver ligado os nomes dos mapas com “tie”).

# Obtém lista de arquivos contendo a palavra “quando”.
@files_with_quando=keys(%{$word2files{"quando"}});

# Obtém lista de palavras do arquivo “xpto.txt”.
@list_of_xpto_words=keys(%{$file2words{"/diretorio/a/ser/varrido/xpto.txt"}});

# Verifica quais dos arquivos contêm as palavras “quando” e
# “chora”.
@files_with_quando_and_chora=
grep {
exists($file2words{$_}{"chora"})
} @files_with_quando
;



3. Re: Ajuda na reconstrução da minh'alma.

Hiboµ, the Owl
Hiboµ

(usa Nenhuma)

Enviado em 16/02/2017 - 13:32h

paulo1205:

Qual o espaço total ocupado por esses mais de trezentos mil arquivos txt?


df -h me retornou algo em torno de 2,3 GB.


Eu ficaria tentado a montar dois mapas, word2files e file2words, que, como os nomes indicam, podem chegar aos nomes de arquivos contendo determinadas palavras ou às palavras contidas em determinados arquivos. O problema com isso é que esses mapas tenderiam a aproximadamente duplicar (ou triplicar) o tamanho total dos arquivos.


Eu posso setar onde ficarão estes mapas? Pois havendo possibilidade, a questão do tamanho dos arquivos não vira empecilho.

Quando o conjunto de dados é relativamente pequeno, eu costumo montar mapas assim em RAM. Se for grande (aproximadamente da mesma ordem que a RAM ou maior que ela), você teria de usar um banco de dados em disco (e aí você poderia questionar se valeria a pena trocar busca em disco por busca em disco, e a resposta seria que sim, se a solução de banco contar com índices que agilitem uma busca, e também com algoritmos de cache, em vez de fazer e refazer buscas meramente sequenciais, que é o jeito como trabalha o grep).


Arhm.. Busca em disco por busca em disco? bom, pelo que entendi, este método vai fazer um banco de dados pra que a busca não se torne sequencial como é com a RAM, e a partir do banco de dados com as informações, ele vai atrás utilizando o cache que aumentaria a agilidade das buscas. Não sei se peguei direito a idéia, se puder, por favor, poderia explicar de uma outra maneira?

Para esse tipo de coisa, eu costumo preferir Perl ao shell. Além de ser geralmente mais eficiente (veja, por exemplo, as mensagens 7 e 9 do tópico https://www.vivaolinux.com.br/topico/Shell-Script/Como-criar-um-script-para-localizar-varias-palavra...), ele tem meios de associar diretamente seus arrays associativos com back-ends de bancos de dados, através da função tie da linguagem, que facilitariam uma eventual migração para um conjunto de dados muito grande para disco, em vez de RAM.


Lí o tópico, divoso o senhor hein? a nível de off-topic perguntaria sobre tua história com programação, mas já me puxaram a orelha sobre prolixidades, deixemos pra outra ocasião. E Sim, fica bem explícito que Shell não é a melhor linguagem no tratamento destes meus dados.


O script abaixo mostra mais ou menos como se poderiam montar os mapas mencionados acima em Perl.

@list_of_xpto_words=keys(%{$file2words{"/diretorio/a/ser/varrido/xpto.txt"});  



Buenas, estou rodando o código agora, modifiquei ele para minha realidade, só queria deixar um adendo que sua linha 39 está errada, é um erro muito pequeno de sintaxe, se possível você poderia editá-la para caso alguma outra pessoa venha a reutilizar o código não se depare com o mesmo erro? o correto seria

 @list_of_xpto_words=keys(%{$file2words{"/diretorio/a/ser/varrido/xpto.txt"}});  


A propósito, estou recebendo várias saídas do tipo:

utf8 "\x8D¹" does not map to Unicode at ./Script_paulo.pl line 19¹ <FILE> LINE 118²

¹ = Os valores variam
² = Algumas vezes não mostra este pedaço <FILE> LINE nro

Muito obrigado pela ajuda até agora, sou imensamente agradecido.
Carpe Diem.


4. Re: Ajuda na reconstrução da minh'alma.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/02/2017 - 19:57h

Hiboµ escreveu:

paulo1205:

Qual o espaço total ocupado por esses mais de trezentos mil arquivos txt?


df -h me retornou algo em torno de 2,3 GB.


Se você está numa máquina com apenas 2GiB, então o exemplo que eu dei, que lê para a memória, pode não ser útil para você.

Eu posso setar onde ficarão estes mapas? Pois havendo possibilidade, a questão do tamanho dos arquivos não vira empecilho.


Pode. Como eu mencionei, se você quiser mesmo fazer com Perl, pode usar o comando tie para mapear os arrays associativos da linguagem num back-end que grave os dados em disco. De pronto, deve haver na sua instalação do Perl módulos para permitir mapeamento em GDBM e Berkeley DB.

Como talvez lhe interesse fazer buscas por partes das palavras, talvez seja melhor usar Berkeley DB, escolhendo o módulo que usa árvore-B, em vez de função hash.

Quando o conjunto de dados é relativamente pequeno, eu costumo montar mapas assim em RAM. Se for grande (aproximadamente da mesma ordem que a RAM ou maior que ela), você teria de usar um banco de dados em disco (e aí você poderia questionar se valeria a pena trocar busca em disco por busca em disco, e a resposta seria que sim, se a solução de banco contar com índices que agilitem uma busca, e também com algoritmos de cache, em vez de fazer e refazer buscas meramente sequenciais, que é o jeito como trabalha o grep).


Arhm.. Busca em disco por busca em disco? bom, pelo que entendi, este método vai fazer um banco de dados pra que a busca não se torne sequencial como é com a RAM, e a partir do banco de dados com as informações, ele vai atrás utilizando o cache que aumentaria a agilidade das buscas. Não sei se peguei direito a idéia, se puder, por favor, poderia explicar de uma outra maneira?


Quando eu falei de trocar “busca em disco” por “busca em disco”, eu me referi a trocar uma busca linear por uma busca usando índices.

De todo modo, busca em disco será mais lenta do que busca com estrutura de dados equivalente totalmente contida em RAM, especialmente para um conjunto de dados grande.

O exemplo de código que eu mostrei trazia todos os dados apenas para RAM, sem gravar nada em disco. Então, se você tiver pouca RAM, não gaste muito tempo com aquele programa, a não ser sobre um conjunto limitado de dados, ou que faça as necessárias adaptações para incluir persistência em disco.

A versão abaixo introduz essa persistência, mapeando os arrays associativos do Perl em arquivos no formato Berkeley DB. Usei BDB, em vez de GBDM por que, até onde me lembro, o GDBM implementa apenas tabela hash, enquanto o BDB permite escolher entre hash, registros numerados e árvore-B, e este último permite percorrer as chaves dos arrays associativos de um modo em que tais chaves aparecerão naturalmente ordenadas.

#!/usr/bin/perl

use locale ':not_characters';
use open ':locale';

use Fcntl;
use DB_File;
use POSIX;

setlocale(LC_ALL, "");

tie %file2words, "DB_File", "/tmp/file2words.db", O_RDWR|O_CREAT|O_TRUNC, 0644, $DB_BTREE;
tie %word2files, "DB_File", "/tmp/word2files.db", O_RDWR|O_CREAT|O_TRUNC, 0644, $DB_BTREE;

if(!open(FIND, "-|", "find", "$ENV{HOME}/prog", qw(-iname *.c -o -iname *.h -o -iname *.cc -o -iname *.cpp -o -iname *.tcc -o -iname *.hpp -o -iname *.pl))){
die("Could not run find: $!.\n");
}
$nfiles=0;
$nwords=0;
while(defined($file=<FIND>)){
chomp($file);

if(!open(FILE, "<", $file)){
die("Could not open $file: $!.\n");
}

printf STDERR ("\rProcessando arquivo %d...", ++$nfiles);

# Para cada arquivo, monta um conjunto em RAM das palavras presentes
# apenas nesse arquivo.
%words=(); @wordlist=();
while(defined($line=<FILE>)){
chomp($line);
while($line=~/\b(\p{Latin}+)\b(.*)/){
$line=$2;
$word=lc($1);
$words{$word}=1;
}
}
close(FILE);
@wordlist=sort(keys(%words));

# Após montado o conjunto do arquivo atual, integra-o com os dados
# já existentes em disco.
$file2words{$file}=join(",", @wordlist);
foreach $word (@wordlist){
%files=();
if(exists($word2files{$word})){
%files=
map {
($_ => 1);
} (split(/\0/, $word2files{$word}))
;
}
else{
++$nwords;
}
$files{$file}=1;
$word2files{$word}=join("\0", sort(keys(%files)));
}
}
close(FIND);

printf STDERR ("\rTotal de %d arquivos processados, com %d palavras distintas.\n", $nfiles, $nwords);


Uma vez criados os mapeamentos com o programa acima, eu posso realizar consultas imediatamente com qualquer outro programa, simplesmente refazendo o tie entre um array associativo e o respectivo arquivo.

#!/usr/bin/perl

# Exemplo de programa que usa os arquivos já criados.

use locale ':not_characters';
use open ':locale';

use Fcntl;
use DB_File;
use POSIX;

setlocale(LC_ALL, "");

# Note que, nete caso, eu abro os arquivos somente para leitura, e somente se
# os arquivos já existirem (mas você pode optar por fazer de outro modo, é claro).
tie %file2words, "DB_File", "/tmp/file2words.db", O_RDONLY, 0644, $DB_BTREE;
tie %word2files, "DB_File", "/tmp/word2files.db", O_RDONLY, 0644, $DB_BTREE;

if(exists($word2files{"chora"})){
# Bla, bla, bla...
# ...
}
if(exists($file2words{"$ENV{HOME}/prog/4fun/roman_numeral/roman_numeral.cc"})){
# Ble, ble, ble...
# ...
}
# ...


Observe porém que, para gravar em disco, algumas mudanças tiveram de ser feitas em relação à estrutura de dados que eu usei no programa da primeira resposta. Isso está claro no programa gerador dos mapas e se reflete nos programas que forem consultar tais dados.

Naquela versão que usava apenas a RAM, os arrays associativos eram bidimensionais: cada elemento do array associativo de palavras era um array associativo de arquivos, e cada elemento do array associativo de arquivos era um array associativo de palavras. Entretanto, como “arrays de arrays” em Perl recorrem implicitamente a ponteiros, uma tentativa mal-informada de reescrever aquele primeiro programa simplesmente inserindo as linhas de comando tie provocaria tão-somente a gravação em disco de um conjunto de ponteiros, e isso não teria valor nenhum para recuperar qualquer dado num momento posterior (na verdade, apenas perderia tempo).

Desse modo, os arrays de primeiro nível $file2words e $word2files passaram a ter elementos que são concatenações, respectivamente, das palavras listadas em cada arquivo (usando o caráter “,” para indicar a distinção entre palavras) e dos nomes os arquivos em que cada palavra aparece (usando o byte nulo separador entre nomes, pois o byte nulo é o único caráter que nunca pode aparecer como parte de um pathname no UNIX).

A consequência disso é que a etapa de consulta será obrigada a explicitamente separar os componentes das listas que foram concatenadas. Se você não quiser ter de ser explícito sobre isso o tempo todo, pode fazer algumas funções que implementam esse trabalho, numa forma que lhe permita ter um uso mais conveniente em outras partes do programa.

# Função que obtém lista de palavras num arquivo.  Recebe como parâmetros
# o array associativo que representa o mapa de arquivos para palavras e o nome
# do arquivo a ser buscado. Caso o aquivo não exista no mapa, aborta a execução
# (se você não quiser que isso mate o script, chame a função dentro de um bloco eval).
sub get_words (\%$) {
my ($p_file2words, $file_to_look_for)=@_;
die("file not found in map: $file_to_look_for\n") unless exists($p_file2words->{$file_to_look_for});
return (split(/,/, $p_file2words->{$file_to_look_for}));
}

# Função que obtém lista de arquivos contendo certa palavra. Recebe como
# parâmetros o array associativo com o mapa de palavra para arquivos e a
# palavra a ser buscada. Caso a palavra não exista no mapa, aborta a execução
# (se você não quiser que isso mate o script, chame a função dentro de um bloco
# eval).
sub get_files (\%$) {
my ($p_word2files, $word_to_look_for)=@_;
die("word not found in map: $word_to_look_for\n") unless exists($p_word2files->{$word_to_look_for});
return (split(/\0/, $p_word2files->{$word_to_look_for}));
}


O modo de uso das funções acima seria mais ou menos o seguinte.

# Encontra todos os arquivos contendo as palavras “string” e “mkdir”
# (lembre que eu varri meu diretório de código fonte ;) ).
@files_with_string_and_mkdir=();
eval {
foreach $file (get_files(%word2files, "string")) {
push(@files_with_string_and_mkdir, $file) if grep { $_ eq "mkdir" } get_words(%file2words, $file);
}
# PS: Não se engane, essa operação, embora muito mais eficiente do que
# ficar (re)executando greps em disco, ainda pode ser relativamente cara.
};
if($@ eq ""){
print join("\n", @files_with_string_and_mkdir), "\n";
}
else{
chomp($@);
print STDERR "ERROR: $@.\n";
}


Buenas, estou rodando o código agora, modifiquei ele para minha realidade, só queria deixar um adendo que sua linha 39 está errada, é um erro muito pequeno de sintaxe, se possível você poderia editá-la para caso alguma outra pessoa venha a reutilizar o código não se depare com o mesmo erro? o correto seria

 @list_of_xpto_words=keys(%{$file2words{"/diretorio/a/ser/varrido/xpto.txt"}});  


Obrigado pelo aviso.

Eu tinha escrito aquele código diretamente no fórum, e não cheguei a testá-lo. Então nem reparei que esqueci de fechar uma chave. Já corrigi a postagem original.

Havia pelo menos um outro erro, que eu também corrigi. Embora a variável de ambiente LANG possa ser usada pela libc para ajustar aspectos da locale na falta de um valor específico para tal aspecto (como LC_CTYPE ou LC_NUMERIC), não existe um parâmetro LANG que se possa chamar com setlocale(). Então eu removi a linha que tentava fazer isso.

A propósito, estou recebendo várias saídas do tipo:

utf8 "\x8D¹" does not map to Unicode at ./Script_paulo.pl line 19¹ <FILE> LINE 118²

¹ = Os valores variam
² = Algumas vezes não mostra este pedaço <FILE> LINE nro


Julgando pelas mensagens, parece-me que os arquivos foram escritos numa locale diferente da que você está usando no Linux. Eu chutaria que o Linux está usando codificação UTF-8, e os (ou alguns dos) arquivos devem estar com ISO8859-1 ou Windows-1252.

Experimente selecionar uma locale diferente antes de rodar os scripts (e.g. “env LC_ALL=pt_BR.ISO8859-1 ./nome_do_script”) e veja se os resultados melhoram. Um eventual problema é que se você tiver também arquivos com locales diferentes (por exemplo: arquivos criados no Windows com uma locale e arquivos criados no Linux com outra locale) dentro dessa massa de dados, pode vir a inverter a situação, com arquivos que antes não davam problemas passando a dar. Pode também experimentar comentar as linhas que tratam de locales nos scripts, mas o preço disso é que o Perl pode parar de tratar letras acentuadas, e você pode ficar com palavras truncadas nos seus mapas.


5. Re: Ajuda na reconstrução da minh'alma.

Hiboµ, the Owl
Hiboµ

(usa Nenhuma)

Enviado em 16/02/2017 - 22:39h

Caramba, tá explicado porque eu ia mal nas aulas de programação.
Eu entendo no limiar das possibilidades. Mas te sou imensamente grato pela atenção @paulo1205. Antes de começar com a metralhadora de perguntas, não poderia indicar algum material sobre Perl para que eu dê uma estudada e consiga acompanhar melhor os teus códigos?

Então descartemos a RAM.
Eu acho que houve um equivoco da minha parte pois eu imaginei que o resultado de saída iria me mostrar algo como no grep. Em que eu poderia ver a linha onde se encontrava a palavra e o nome do arquivo ( como disse, os arquivos estão com nomes aleatórios). Eu não entendi direito o que aquele primeiro script fez, ele fez uma varredura nos arquivos procurando as palavras setadas "quando" e "chora", mas eu esperava algum retorno do destino onde os arquivos com as palavras estavam, peço desculpas pela dificuldade em entender. Os outros scripts ainda não foram testados.

Estou relendo os códigos e tentando entender como o processo todo vai se dar, seria algo como
Vai ser feito o mapeamento, onde eu devo trazer pra minha realidade os formatos, nesse caso eu quero apenas txt, consigo editar isto.

E depois os outros scripts são respectivamente de consulta, sendo o primeiro faz consulta de palavra dentro de arquivo e também de arquivo que tenha certa palavra (acredito que esta parte do código me é desnecessária, se for esta sua real função, uma vez que os arquivos tem nomes como f10551945.txt) enquanto que o outro faz uma busca mais.. seca?

Paulo, perdão as noobices, mas eu não sei fazer nada mais que um hello world. Mas é dada a necessidade e eu preciso aprender isto, agradeço por demais teu apoio. Aos poucos eu consigo.
Carpe Diem.



6. Re: Ajuda na reconstrução da minh'alma.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/02/2017 - 11:39h

Hiboµ escreveu:

Eu entendo no limiar das possibilidades. Mas te sou imensamente grato pela atenção @paulo1205. Antes de começar com a metralhadora de perguntas, não poderia indicar algum material sobre Perl para que eu dê uma estudada e consiga acompanhar melhor os teus códigos?


Não conheço nenhum material on-line. De livros, eu usei o Programming Perl, da editora O'Reilly, enquanto estava aprendendo. Mas eu nunca tive esse livro: eu usava o do meu trabalho (na época).

Eu acho que houve um equivoco da minha parte pois eu imaginei que o resultado de saída iria me mostrar algo como no grep. Em que eu poderia ver a linha onde se encontrava a palavra e o nome do arquivo ( como disse, os arquivos estão com nomes aleatórios).


O script da primeira postagem era um exmplo básico, para dar uma ideia de como fazer ou servir de ponto de partida para alguma coisa maior, e/ou melhor e/ou mais efetiva. Ele montava em RAM (o que significa que os dados são perdidos quando o script termina) mapas de arquivos para palavras contidas em cada um (%file2words) e de palavras para arquivos que as continham (%word2files).

Ao final do programa (aproximadamente o último terço) eu dei exemplos de como consultar as informações coletadas anteriormente, usando justamente o caso que você apresentara, de arquivos que continham ao mesmo tempo, em qualquer ordem e mesmo em linhas distintas, as palavras “quando” e “chora”. Isso era feito em duas etapas: primeiro eu descobria os arquivos contendo uma das palavras (“quando”), e depois refinava essa busca, verificando quais desses arquivos possuíam também a outra palavra. Se você parar para pensar, isso não é muito diferentes do que se poderia fazer manualmente com o grep -- a não ser pelo fato de que a primeira varredura, que examina todos os arquivos, já montaria um esquema de referências cruzadas completo, de modo que qualquer consulta futura não implicaria ter de reexecutar o grep sobre os mesmos arquivos.

Mas o script realmente não imprimia nada, apenas colocava os nomes dos arquivos que atendiam determinados critérios dentro de variáveis. A aplicação das respostas a consultas, usando essas variáveis ou outras, frutos de outras consultas que você pudesse ter em mente, é algo que você teria de fazer por conta própria, de acordo com suas necessidades.

Eu não entendi direito o que aquele primeiro script fez, ele fez uma varredura nos arquivos procurando as palavras setadas "quando" e "chora", mas eu esperava algum retorno do destino onde os arquivos com as palavras estavam, peço desculpas pela dificuldade em entender. Os outros scripts ainda não foram testados.


Expliquei acima, sem entrar no detalhe do uso da linguagem, pelo menos o quê ele faz. Espero que tenha ficado suficientemente claro.

Estou relendo os códigos e tentando entender como o processo todo vai se dar, seria algo como
Vai ser feito o mapeamento, onde eu devo trazer pra minha realidade os formatos, nesse caso eu quero apenas txt, consigo editar isto.

E depois os outros scripts são respectivamente de consulta, sendo o primeiro faz consulta de palavra dentro de arquivo e também de arquivo que tenha certa palavra (acredito que esta parte do código me é desnecessária, se for esta sua real função, uma vez que os arquivos tem nomes como f10551945.txt) enquanto que o outro faz uma busca mais.. seca?


As duas coisas são úteis. Veja o último exemplo na postagem anterior. Note que eu uso as duas funções para fazer a busca de duas palavras ao mesmo tempo. Primeiro eu uso uma busca da palavra para obter uma lista de arquivos. Para cada (comando foreach) dos arquivos produzidos por essa lista, eu verifico a lista das palavras contidas nesse arquivo, a fim de ver se a segunda palavra está lá (comando grep). Após essa filtragem, eu imprimo a lista resultante (comando print).

Paulo, perdão as noobices, mas eu não sei fazer nada mais que um hello world. Mas é dada a necessidade e eu preciso aprender isto, agradeço por demais teu apoio. Aos poucos eu consigo.


Não se preocupe, pois ninguém nasceu sabendo.

Minhas dicas foram para tentar facilitar a sua vida, introduzindo meios de agilitar, através de referências cruzadas produzidas já na primeira varredura dos arquivos, eventuais múltiplas e sucessivas consultas que você poderia ter de fazer sobre uma massa muito grande de dados, já que a segunda consulta em diante poderiam consultar as referências, beneficiando-se da indexação.

Se, contudo, elas estiverem atrapalhando mais do que ajudando, faça de um jeito com que você se sinta confortável.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts