Chociaż find
polecenie jest najprostszym sposobem rekurencyjnego przechodzenia przez drzewo katalogów, istnieją inne sposoby, w szczególności dwa języki skryptowe, które są domyślnie dostarczane z Ubuntu, już mają taką możliwość.
grzmotnąć
bash
ma bardzo ładną globstar
opcję powłoki, która pozwala na rekurencyjne przechodzenie do drzewa katalogów. Wszystko, co musimy zrobić, to sprawdzić, czy element w ./**/*
rozwinięciu jest plikiem i czy zawiera pożądany tekst:
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 ma moduł Find, który pozwala na rekursywne przechodzenie do drzewa katalogów i wykonywanie pod nimi określonych czynności. Za pomocą małego skryptu można przechodzić przez drzewo katalogów, wypychać pliki zawierające żądany ciąg znaków do tablicy, a następnie drukować w następujący sposób:
#!/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"
}
I jak to działa:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Pyton
Python to kolejny język skryptowy, który jest bardzo szeroko stosowany w świecie Ubuntu. W szczególności posiada os.walk()
moduł, który pozwala nam wykonać taką samą akcję jak powyżej - przejść drzewo katalogów i uzyskać listę plików zawierających pożądany ciąg.
Jako jedno-liniowy można to zrobić w następujący sposób:
$ 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']
Pełny skrypt wyglądałby tak:
#!/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
komenda jest w porządku, po prostu zaktualizować locatedb pierwsze, za pomocą poleceniaupdatedb