256 votes

Trouver un fichier par son nom en utilisant la ligne de commande

Je voudrais déterminer l'emplacement d'un fichier en utilisant la ligne de commande. J'ai essayé :

find . -type f -name "postgis-2.0.0"

y

locate postgis-2.0.0

en vain. Quelle est la commande qui permet de déterminer le répertoire du fichier, à condition de connaître son nom ?

4voto

ptetteh227 Points 1644

Cela devrait simplifier la localisation du fichier :

Cela vous donnera le chemin complet du fichier

tree -f  / | grep postgis-2.0.0

Tree liste le contenu des répertoires dans un format arborescent. le -f indique à tree de donner le chemin complet du fichier. Comme nous n'avons aucune idée de son emplacement ou de l'emplacement du parent, il est bon de chercher à partir de la racine du système de fichiers. / de façon récursive vers le bas. Nous envoyons ensuite la sortie à grep pour mettre en évidence notre mot, postgis-2.0.0

0voto

Sergiy Kolodyazhnyy Points 97292

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))

0voto

$ find . -type f | grep IMG_20171225_*
Donne
./03-05--2018/IMG_20171225_200513.jpg
Le DOT après la commande find est d'énoncer un point de départ,
D'où le dossier actuel,
"canalisé" (=filtré) par le filtre à noms IMG_20171225_*

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X