Bien que la commande find
soit 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 avec Ubuntu par défaut ont déjà la possibilité de le faire.
bash
bash
a une très belle option globstar
shell, qui permet la traversée récursive de l'arborescence. Tout ce que nous avons à faire est de tester si un élément de l'extension ./**/*
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
Le module Perl a Find, qui permet d’effectuer une traversée récursive de l’arborescence des répertoires, et d’effectuer une action spécifique sur les sous-programmes. Avec un petit script, vous pouvez parcourir l’arborescence des répertoires, placer les fichiers contenant la chaîne souhaitée dans un tableau, puis les imprimer comme suit:
#!/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 ça marche:
$ ./find_file.pl "postgis-2.0.0"
./testdir/texts/postgis-2.0.0
Python
Python est un autre langage de script très utilisé dans le monde Ubuntu. En particulier, il dispose du module os.walk()
qui nous permet d’effectuer la même action que ci-dessus - de parcourir l’arborescence des répertoires et d’obtenir la liste des fichiers contenant la chaîne souhaitée.
En tant que monotone, 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']
Le script complet devrait ressembler à ça:
#!/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))