Mentre il find
comando è il modo più semplice per attraversare ricorsivamente l'albero delle directory, ci sono altri modi e in particolare i due linguaggi di scripting forniti di default con Ubuntu hanno già la possibilità di farlo.
bash
bash
ha globstar
un'opzione shell molto bella , che consente l'attraversamento ricorsivo dell'albero delle directory. Tutto ciò che dobbiamo fare è verificare se l'elemento ./**/*
nell'espansione è un file e se contiene il testo desiderato:
bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done
./testdir/texts/postgis-2.0.0
Perl
Perl ha il modulo Trova, che consente di eseguire l'attraversamento ricorsivo dell'albero delle directory e, tramite subroutine, di eseguire azioni specifiche su di essi. Con un piccolo script, è possibile attraversare l'albero delle directory, inserire nell'array i file che contengono la stringa desiderata e quindi stamparla in questo modo:
#!/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 come funziona:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Pitone
Python è un altro linguaggio di scripting molto utilizzato nel mondo di Ubuntu. In particolare, ha un os.walk()
modulo che ci consente di eseguire la stessa azione sopra - attraversare l'albero delle directory e ottenere un elenco di file che contengono la stringa desiderata.
Come one-liner questo può essere fatto in questo modo:
$ 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']
Lo script completo sarebbe simile al seguente:
#!/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 va bene, aggiorna prima il foundb, usando il comandoupdatedb