Хотя 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