Embora o find
comando seja a maneira mais simples de percorrer recursivamente a árvore de diretórios, existem outras maneiras e, em particular, as duas linguagens de script que acompanham o Ubuntu por padrão já têm a capacidade de fazê-lo.
bater
bash
possui uma globstar
opção muito boa de shell, 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, executar ações específicas sobre eles. Com um pequeno script, você pode percorrer a árvore de diretórios, enviar arquivos que contêm a sequência desejada para a matriz e imprimi-la da seguinte maneira:
#!/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
Pitão
Python é outra linguagem de script usada amplamente no mundo do Ubuntu. Em particular, ele possui um os.walk()
módulo que nos permite executar a mesma ação que a árvore de diretórios acima - atravessar e obter a lista de arquivos que contêm a sequência desejada.
Como uma linha, isso pode ser feito da seguinte maneira:
$ 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))
locate
comando está bem, apenas atualizar o locatedb primeiro, usando o comandoupdatedb