find
Komut, dizin ağacını yinelemeli olarak geçmenin en basit yolu olsa da, başka yollar vardır ve özellikle Ubuntu ile birlikte gelen iki komut dosyası dili zaten bunu yapabilir.
darbe
bash
globstar
dizin ağacının özyinelemeli geçişini sağlayan çok hoş bir kabuk seçeneğine sahiptir. Tek yapmamız gereken, ./**/*
genişletmedeki öğenin bir dosya olup olmadığını ve istenen metni içerip içermediğini sınamaktır :
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, dizin ağacının özyinelemeli geçişini ve alt yordam yoluyla bunlar üzerinde belirli bir eylem gerçekleştirmesini sağlayan Find modülüne sahiptir. Küçük bir komut dosyasıyla, dizin ağacını geçebilir, istediğiniz dizeyi içeren dosyaları dizinin içine itebilir ve ardından şöyle yazdırabilirsiniz:
#!/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"
}
Ve nasıl çalıştığını:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
piton
Python, Ubuntu dünyasında çok yaygın olarak kullanılan başka bir betik dilidir. Özellikle, os.walk()
yukarıdaki - travers dizin ağacındaki gibi aynı işlemi yapmamızı ve istenen dizeyi içeren dosyaların listesini almamızı sağlayan modüle sahiptir.
Tek astar olarak bu şekilde yapılabilir:
$ 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']
Tam komut dosyası şöyle görünür:
#!/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
Komut iyidir, sadece komutunu kullanarak, ilk locatedb güncellemeupdatedb