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


183

Je voudrais déterminer l'emplacement d'un fichier en 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?


2
la locatecommande est correcte, il suffit de mettre à jour le situé, en utilisant la commandeupdatedb
thucnguyen

S'il est déjà installé, le nouveau nom de fichier risque de ne postgis-2.0.0plus l' être . Habituellement, après les installations via les gestionnaires de paquets, les exécutables se trouvent dans l’un des $PATHdossiers, essayez which postgisde voir l’emplacement. S'il ne renvoie rien, vous devez alors rechercher manuellement l'emplacement du fichier.
sdkks

Réponses:


232

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

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

Bonne chance


1
ah wgetoui j'ai utilisé comme racine tellement /travaillé merci
Sam007

pour en savoir plus, consultez ce lien help.ubuntu.com/community/find
habibun

Je trouve find: / Users / UserName // Library / État d'application sauvegardé / com.bitrock.appinstaller.savedState: erreur d'autorisation refusée. il apparaît à chaque exécution de la commande. Comment s'en débarrasser?
Eduard

29

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 lui sudopermet de rechercher dans tous les dossiers / sous-dossiers.

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

sudo updatedb

première. Pour une raison quelconque, je n'ai jamais de chance avec locate.

locateutilise la base de données des fichiers et des répertoires faites par updatedb. Donc, si vous avez téléchargé un nouveau fichier, il y a plus de chance que vous n'ayez updatedbpas mis à jour la base de données de fichiers et de répertoires. Vous pouvez utiliser sudo updatedbavant d'utiliser locateun programme utilitaire. updatedbfonctionne généralement une fois par jour seul sur les systèmes linux.


14

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

Essayer find . -type d | grep DIRNAME


Y a-t-il un avantage à utiliser grep over -name?
TryHarder

@oooooo J'ai ajouté un motif dans ma réponse ci
zanbri le

trouver plus grep était la seule chose qui a fonctionné pour moi
malhal

12

Les autres réponses sont bonnes, mais je trouve que le fait d'omettre des Permission denieddéclarations me donne des réponses plus claires (omis stderrs en raison de l'absence d'exécution sudo):

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

où:

  • / peut être remplacé par le répertoire dans lequel vous voulez commencer votre recherche
  • fpeut être remplacé par dsi vous recherchez un répertoire au lieu d'un fichier
  • -inamepeut être remplacé par -namesi vous voulez que la recherche soit sensible à la casse
  • le *s dans le terme de recherche peut être omis si vous ne voulez pas les caractères génériques 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 recherché correspond à n’importe quel endroit du chemin complet du fichier, /home/postgis-2.0.0/docs/Readme.txt


2
Il y a -regexet -iregexcommutateurs pour la recherche avec Regular Expressions, qui trouverait le chemin mentionne aussi bien. Suggestion de trouver un élément qui est un fichier ( -type f) grepest alors plus coûteuse en ressources. Permission deniedse produit lorsque l'utilisateur n'a pas accès aux fichiers ou aux dossiers, l'utilisation de sudobefore find permettra à find de voir tous les fichiers.
sdkks

1
Bon à savoir sur les commutateurs regex, merci.
Zanbri

@zanbri Utilisez -wholenameou à la -iwholenameplace de la tuyauterie vers grep.
Wjandrea

4

Essayer 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 soient sensibles à la casse.

  • 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.


3

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. l' -farborescence indique le chemin d'accès complet au fichier. comme nous n’avons aucune idée de son emplacement ni de son emplacement parent, il est bon de rechercher de la racine du système de fichiers de /manière récursive vers le bas. Nous envoyons ensuite la sortie à grep pour mettre en évidence notre mot,postgis-2.0.0


0

Bien que la findcommande soit le moyen le plus simple pour 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.

frapper

bash a une très bonne globstaroption shell, qui permet une traversée récursive de l’arborescence. Tout ce que nous avons à faire est de vérifier 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

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, pousser 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 a un os.walk()module 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 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 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

$ find . -type f | grep IMG_20171225_*
Dote
./03-05--2018/IMG_20171225_200513.jpg
le DOT après la commande finddoit énoncer un point de départ,
donc - le dossier en cours,
"piped" (= filtré) à travers le filtre de nomsIMG_20171225_*

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.