web-dev-qa-db-fra.com

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"

et

locate postgis-2.0.0

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

173
Sam007

Essayez find ~/ -type f -name "postgis-2.0.0" à la place.

Utiliser . ne cherchera que dans le répertoire actuel. ~/ cherchera dans tout votre répertoire personnel (probablement là où vous l'avez téléchargé). Si vous utilisez wget en tant que racine, il est possible que ce soit ailleurs, vous pouvez donc utiliser / pour effectuer une recherche dans tout le système de fichiers.

Bonne chance

217
adempewolff

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 tout rechercher à partir de la racine si vous ne savez vraiment pas. En outre, le type -f signifie la recherche de fichiers, pas de dossiers. L'ajout de Sudolui permet d'effectuer une recherche dans tous les dossiers/sous-dossiers.

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

Sudo updatedb

premier. Pour une raison quelconque, je n'ai jamais eu de chance avec locatecependant.

locateutilise une base de données de fichiers et de répertoires créés par updatedbname__. Par conséquent, si vous avez téléchargé un nouveau fichier, il y a plus de chance que votre updatedbn'ait pas mis à jour la base de données de fichiers et de répertoires. Vous pouvez utiliser Sudo updatedb avant d'utiliser l'utilitaire locatename__. updatedbs'exécute généralement une fois par jour sur les systèmes linux.

29
reverendj1

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

Essayez find . -type d | grep DIRNAME

13
Mitch

Les autres réponses sont bonnes, mais je trouve que omettre les instructions Permission denied me donne des réponses plus claires (omet stderrs car je n’ai pas lancé Sudo):

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

où:

  • / peut être remplacé par le répertoire dans lequel vous souhaitez commencer 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 les résultats si le terme de recherche correspond à n’importe où dans le chemin de fichier complet, par exemple. /home/postgis-2.0.0/docs/Readme.txt

9
zanbri

Essayez find . -name "*file_name*"

  • où vous pouvez remplacer "." (regardez dans le répertoire actuel) par "/" (regardez dans tout le système) ou "~ /" (regardez dans le répertoire de base).

  • où vous pouvez remplacer "-name" par "-iname" si vous ne souhaitez pas que les majuscules des minuscules soient respectées.

  • où vous pouvez changer "nom_fichier" (un fichier qui peut commencer et se terminer par quoi que ce soit) par le nom exact du fichier.

2
RuiVBoas

Cela devrait simplifier la localisation du fichier:

Cela vous donnerait le chemin complet du fichier

tree -f  / | grep postgis-2.0.0

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

2
ptetteh227

$ find . -type f | grep IMG_20171225_*
Donne
./03-05--2018/IMG_20171225_200513.jpg
Le DOT après la commande find doit indiquer un point de départ,
Par conséquent - le dossier actuel,
"canalisé" (= filtré) via le filtre de nom IMG_20171225_*

0
Jadeye

Bien que la commande find soit le moyen le plus simple de parcourir récursivement l’arborescence de répertoires, il existe d’autres méthodes, notamment les deux langages de script fournis avec Ubuntu par défaut.

bash

bash a une très jolie option globstar Shell, qui permet la traversée récursive de l’arborescence. Il suffit de vérifier si l'é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

Perl a le module Find qui permet d’effectuer une traversée récursive de l’arborescence de répertoires et d’effectuer une action spécifique sur ces sous-routines. Avec un petit script, vous pouvez parcourir l’arborescence de répertoires, envoyer les fichiers contenant la chaîne désirée dans un tableau, puis l’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 a le module os.walk() qui nous permet d’effectuer la même action que celle décrite ci-dessus - arborescence de répertoires et d’obtenir la liste des fichiers contenant la chaîne désirée.

En une ligne, cela peut être fait de la manière suivante:

$ 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 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))
0
Sergiy Kolodyazhnyy