一方でfind
、コマンドが再帰的にディレクトリツリーをトラバースする最も簡単な方法があり、そこに他の方法であり、特定のデフォルトでのUbuntuに付属している2つのスクリプト言語は、すでにそうする能力を持っています。
バッシュ
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
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