Während der find
Befehl die einfachste Möglichkeit ist, den Verzeichnisbaum rekursiv zu durchlaufen, gibt es andere Möglichkeiten, und insbesondere die beiden Skriptsprachen, die standardmäßig in Ubuntu enthalten sind, können dies bereits.
Bash
bash
hat eine sehr schöne globstar
Shell-Option, die das rekursive Durchlaufen des Verzeichnisbaums ermöglicht. Wir müssen nur testen, ob es sich bei dem Element in der ./**/*
Erweiterung um eine Datei handelt und ob es den gewünschten Text enthält:
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 verfügt über das Suchmodul, mit dem der Verzeichnisbaum rekursiv durchsucht und über eine Unterroutine bestimmte Aktionen ausgeführt werden können. Mit einem kleinen Skript können Sie den Verzeichnisbaum durchlaufen, Dateien, die die gewünschte Zeichenfolge enthalten, in ein Array verschieben und dann wie folgt drucken:
#!/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"
}
Und so geht's:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Python
Python ist eine weitere Skriptsprache, die in der Ubuntu-Welt sehr verbreitet ist. Insbesondere verfügt es über ein os.walk()
Modul, mit dem wir die gleiche Aktion wie oben ausführen können - Verzeichnisbaum durchlaufen und eine Liste der Dateien abrufen, die die gewünschte Zeichenfolge enthalten.
Als Einzeiler kann dies folgendermaßen erfolgen:
$ 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']
Das vollständige Skript würde folgendermaßen aussehen:
#!/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
befehl ist in ordnung, aktualisiere einfach zuerst den lokalisierten b mit befehlupdatedb