Alors que find
est le moyen le plus simple de parcourir récursivement l'arborescence des répertoires, il existe d'autres moyens et en particulier les deux langages de script fournis par défaut avec Ubuntu ont déjà la capacité de le faire.
bash
bash
a une très belle globstar
L'option Shell, qui permet une traversée récursive de l'arborescence des répertoires. Tout ce que nous avons à faire, c'est de tester si l'élément dans l'option ./**/*
est un fichier et s'il contient le texte souhaité :
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 possède le module Find, qui permet d'effectuer une traversée récursive de l'arborescence des répertoires et, par le biais de sous-programmes, d'effectuer des actions spécifiques sur ceux-ci. Avec un petit script, vous pouvez parcourir l'arbre des répertoires, pousser les fichiers qui contiennent la chaîne désirée dans un tableau, puis l'imprimer comme ceci :
#!/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"
}
Et comment cela fonctionne :
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Python
Python est un autre langage de script qui est très largement utilisé dans le monde Ubuntu. En particulier, il possède os.walk()
qui nous permet d'effectuer la même action que ci-dessus - parcourir l'arbre des répertoires et obtenir la liste des fichiers qui contiennent la chaîne de caractères désirée.
En une ligne, cela peut être fait comme suit :
$ 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']
Un script complet ressemblerait à ceci :
#!/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))