Embora o comando find
seja a maneira mais simples de percorrer recursivamente a árvore de diretórios, há outras maneiras e, em particular, as duas linguagens de script que vêm com o Ubuntu, por padrão, já têm a capacidade de fazê-lo.
bash
bash
tem uma opção globstar
shell muito agradável, que permite a travessia recursiva da árvore de diretórios. Tudo o que precisamos fazer é testar se o item na expansão ./**/*
é um arquivo e se contém o texto desejado:
bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done
./testdir/texts/postgis-2.0.0
Perl
O Perl possui o módulo Find, que permite realizar a travessia recursiva da árvore de diretórios e, através da sub-rotina, realizar ações específicas sobre eles. Com um pequeno script, você pode percorrer a árvore de diretórios, enviar arquivos que contêm a string desejada para a matriz e imprimi-lo da seguinte forma:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
my @wanted_files;
find(
sub{
-f $_ && $_ =~ $ARGV[0]
&& push @wanted_files,$File::Find::name
}, "."
);
foreach(@wanted_files){
print "$_\n"
}
E como funciona:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Python
O Python é outra linguagem de script que é usada amplamente no mundo do Ubuntu. Em particular, ele tem os.walk()
module que nos permite executar a mesma ação como acima - percorrer a árvore de diretórios e obter uma lista de arquivos que contenham a string desejada.
Como uma linha, isso pode ser feito da seguinte forma:
$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'
['./testdir/texts/postgis-2.0.0']
O script completo ficaria assim:
#!/usr/bin/env python
import os;
for r,s,f in os.walk("."):
for i in f:
if "postgis-2.0.0" in i:
print(os.path.join(r,i))