Question Rechercher un fichier par 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, fourni son nom?


125
2018-05-31 17:02


origine


la locate la commande est correcte, il suffit de mettre à jour firster en utilisant la commande updatedb - thucnguyen
S'il est déjà installé, le nouveau nom de fichier peut ne pas être postgis-2.0.0 plus Habituellement, après les installations via les gestionnaires de paquets, les exécutables seraient dans l'un des $PATH dossiers, essayez which postgis pour voir l'emplacement Si rien ne retourne, vous devez alors rechercher manuellement l'emplacement du fichier. - sdkks


Réponses:


Essayer find ~/ -type f -name "postgis-2.0.0" au lieu.

En utilisant . ne recherchera que le répertoire en cours. ~/ va rechercher votre répertoire personnel entier (probablement où vous l'avez téléchargé). Si vous avez utilisé wget en tant que root, il est possible qu'il puisse être ailleurs pour pouvoir utiliser / pour rechercher l'ensemble du système de fichiers.

Bonne chance


154
2018-05-31 17:06



oh j'ai utilisé wget en tant que root / travaillé grâce - Sam007
pour plus de vérifier ce lien help.ubuntu.com/community/find - habibun
Je trouve: / Utilisateurs / Nom d'utilisateur // Bibliothèque / État de l'application enregistrée / com.bitrock.appinstaller.savedState: erreur refusée. il apparaît à chaque exécution de la commande. Comment s'en débarrasser? - Eduard


Je voudrais essayer:

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

Le . signifie rechercher uniquement dans le répertoire courant, 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. Ajouter sudo lui permet de rechercher dans tous les dossiers / sous-dossiers.

Votre syntaxe pour locate est correct, mais vous devrez peut-être courir

sudo updatedb

premier. Pour quelque raison que ce soit, je n’ai jamais de chance avec locate bien que.

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


28
2018-05-31 17:12





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

Essayer find . -type d | grep DIRNAME


11
2018-05-31 17:11



Y a-t-il un avantage ici à utiliser grep sur -name? - TryHarder
@oooooo j'ai ajouté une raison dans ma réponse ci-dessous - zanbri
trouver plus grep était la seule chose qui a fonctionné pour moi - malhal


Les autres réponses sont bonnes, mais je trouve omettre Permission denied déclarations me donne des réponses plus claires (omet stderrs en raison de ne pas courir 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 voulez que la recherche soit sensible à la casse
  • la *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


2
2017-07-29 15:35



Il y a -regex et -iregex commutateurs pour la recherche avec Regular Expressions, qui trouverait également les mentions du chemin. Suggestion de trouver un élément qui est un fichier (-type f) puis grep est plus cher en ressources. Permission denied se produit lorsque l'utilisateur n'a pas accès aux fichiers ou aux dossiers, en utilisant sudo avant la recherche permettra de trouver pour voir tous les fichiers. - sdkks
Bon à savoir sur les commutateurs regex, merci. - zanbri
@zanbri utiliser -wholename ou -iwholename au lieu de la tuyauterie à grep. - wjandrea


Cela devrait simplifier la localisation du fichier:

Cela vous donnerait le chemin complet vers le fichier

tree -f  / | grep postgis-2.0.0

Tree répertorie le contenu des répertoires dans un format arborescent. la -f indique à l'arbre de donner le chemin complet au fichier. comme nous n'avons aucune idée de son emplacement ou de son emplacement parent, il est bon de rechercher à partir de 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
2017-11-18 03:16





Essayer find . -name "*file_name*"

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

  • où vous pouvez changer "-name" en "-iname" si vous ne voulez aucune casse.

  • où tu peux changer "nom de fichier"(un fichier qui peut commencer et se terminer avec ce qu'il est) au nom exact du fichier.


1
2018-03-13 10:05





Tandis que find La commande 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 avec Ubuntu par défaut, ont déjà la possibilité de le faire.

frapper

bash  a une très belle globstar option shell, qui permet la traversée récursive de l'arborescence. Tout ce que nous devons faire est de tester si l'article dans le ./**/* l'expansion est un fichier et indique 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, les fichiers push 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 os.walk() module qui nous permet d'effectuer la même action que ci-dessus - parcourir l'arborescence des répertoires et obtenir la liste des fichiers contenant la chaîne souhaitée.

Comme une seule 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 devrait ressembler à 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
2017-07-13 02:23





$ 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,
"piped" (= filtré) via le filtre de nom IMG_20171225_*


0
2017-09-08 08:38