Sementara find
perintah adalah cara paling sederhana untuk secara traverse melintasi pohon direktori, ada cara lain dan khususnya dua bahasa scripting yang datang dengan Ubuntu secara default sudah memiliki kemampuan untuk melakukannya.
pesta
bash
memiliki globstar
opsi shell yang sangat bagus , yang memungkinkan untuk melakukan traversal rekursif dari pohon direktori. Yang perlu kita lakukan adalah menguji apakah item dalam ./**/*
ekspansi adalah file dan apakah itu berisi teks yang diinginkan:
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 memiliki modul Find, yang memungkinkan untuk melakukan traversal pohon direktori secara rekursif, dan melalui subrutin melakukan tindakan spesifik pada mereka. Dengan skrip kecil, Anda dapat melintasi pohon direktori, mendorong file yang berisi string yang diinginkan ke dalam array, dan kemudian mencetaknya seperti ini:
#!/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"
}
Dan cara kerjanya:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Python
Python adalah bahasa scripting lain yang digunakan sangat luas di dunia Ubuntu. Secara khusus, ia memiliki os.walk()
modul yang memungkinkan kita untuk melakukan tindakan yang sama seperti pohon direktori traverse di atas dan mendapatkan daftar file yang berisi string yang diinginkan.
Sebagai one-liner, ini dapat dilakukan sebagai berikut:
$ 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']
Script lengkap akan terlihat seperti ini:
#!/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
perintah baik-baik saja, hanya update locatedb pertama, menggunakan perintahupdatedb