Незважаючи на те, що find
команда є найпростішим способом рекурсивного переходу до дерева каталогів, існують і інші способи, зокрема дві мови сценаріїв, які поставляються з Ubuntu за замовчуванням, вже мають можливість це зробити.
баш
bash
має дуже хороший globstar
варіант оболонки, що дозволяє рекурсивно обходити дерево каталогів. Все, що нам потрібно зробити, це перевірити, чи є елементом ./**/*
розширення файл і чи містить він потрібний текст:
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 є модуль Find, який дозволяє виконувати рекурсивне обхід дерева каталогів і за допомогою підпрограми виконувати над ними конкретні дії. За допомогою невеликого скрипту ви можете перемістити дерево каталогів, натиснути файли, які містять потрібний рядок, у масив, а потім надрукувати його так:
#!/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"
}
І як це працює:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Пітон
Python - ще одна сценарна мова, яка дуже широко використовується у світі Ubuntu. Зокрема, він має os.walk()
модуль, який дозволяє нам виконувати ту саму дію, що і вище, - обхід дерева каталогів та отримання списку файлів, що містять потрібний рядок.
Як однолінійний це можна зробити так:
$ 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']
Повний сценарій виглядатиме так:
#!/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
команда добре, просто оновити locatedb перше, з допомогою командиupdatedb