Trouver un fichier par nom en utilisant la ligne de commande

122

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"

et

locate postgis-2.0.0

en vain. Quelle est la commande pour déterminer le répertoire du fichier, fourni son nom?

    
posée Sam007 31.05.2012 - 19:02
la source

7 réponses

149

Essayez plutôt find ~/ -type f -name "postgis-2.0.0" .

Utiliser . ne cherchera que dans le répertoire en cours. ~/ recherchera l'intégralité de votre répertoire personnel (probablement là où vous l'avez téléchargé). Si vous avez utilisé wget en tant que root, il est possible que ce soit ailleurs, vous pouvez donc utiliser / pour rechercher le système de fichiers entier.

Goodluck

    
réponse donnée adempewolff 31.05.2012 - 19:06
la source
28

Je voudrais essayer:

sudo find / -type d -name "postgis-2.0.0"

Le. signifie rechercher uniquement dans le répertoire en cours, il est préférable de rechercher tout depuis root si vous ne le savez pas vraiment. De plus, tapez -f signifie rechercher des fichiers, pas des dossiers. L'ajout de sudo lui permet de rechercher dans tous les dossiers / sous-dossiers.

Votre syntaxe pour locate est correcte, mais vous devrez peut-être exécuter

sudo updatedb

d'abord. Pour une raison quelconque, je n'ai jamais eu de chance avec locate cependant.

locate utilise une base de données de fichiers et de répertoires créée par updatedb . Donc, si vous avez téléchargé un nouveau fichier, il y a plus de chance que votre updatedb n'ait pas mis à jour la base de données des fichiers et des répertoires. Vous pouvez utiliser sudo updatedb avant d'utiliser le programme utilitaire locate . updatedb s'exécute généralement une fois par jour sur les systèmes Linux.

    
réponse donnée reverendj1 31.05.2012 - 19:12
la source
11

find est l'un des outils Linux / Unix les plus utiles.

Essayez find . -type d | grep DIRNAME

    
réponse donnée Mitch 31.05.2012 - 19:11
la source
2

Les autres réponses sont bonnes, mais je trouve que l'omission des instructions Permission denied me donne des réponses plus claires (omet stderr s en raison de l'absence d'exécution de sudo ):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

où:

  • / peut être remplacé par le répertoire dans lequel vous souhaitez lancer votre recherche
  • f peut être remplacé par d si vous recherchez un répertoire au lieu d'un fichier
  • -iname peut être remplacé par -name si vous souhaitez que la recherche soit sensible à la casse
  • le * s dans le terme de recherche peut être omis si vous ne voulez pas que les caractères génériques soient dans la recherche

Une alternative est:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

Cette méthode renvoie des résultats si le terme de recherche correspond à n’importe où dans le chemin complet du fichier, par ex. /home/postgis-2.0.0/docs/Readme.txt

    
réponse donnée zanbri 29.07.2016 - 17:35
la source
2

Cela devrait simplifier la localisation du fichier:

Cela vous donnerait le chemin complet vers le fichier

tree -f  / | grep postgis-2.0.0

L'arbre répertorie le contenu des répertoires dans un format arborescent. -f indique à l'arbre de donner le chemin d'accès complet au fichier. comme nous n'avons aucune idée de son emplacement ou de son emplacement parent, il est bon de rechercher récursivement la racine / du système de fichiers vers le bas. Nous envoyons ensuite la sortie à grep pour mettre en évidence notre mot, postgis-2.0.0

    
réponse donnée ptetteh227 18.11.2017 - 04:16
la source
1

Essayez find . -name "*file_name*"

  • où vous pouvez changer '.' (regardez dans le répertoire actuel) en '/' (regardez dans le système entier) ou '~ /' (regardez dans le répertoire personnel).

  • où vous pouvez remplacer "-name" par "-iname" si vous ne voulez pas de majuscule.

  • où vous pouvez changer " nom_fichier " (un fichier qui peut commencer et se terminer avec ce qu’il est) au nom exact du fichier.

réponse donnée RuiVBoas 13.03.2017 - 11:05
la source
0

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))
    
réponse donnée Sergiy Kolodyazhnyy 13.07.2017 - 04:23
la source

Lire d'autres questions sur les étiquettes