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?
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
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 Sudo
lui permet d'effectuer une recherche dans tous les dossiers/sous-dossiers.
Votre syntaxe pour locate
est correcte, mais vous devrez peut-être exécuter
Sudo updatedb
premier. 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éés par updatedb
name__. Par conséquent, 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 de fichiers et de répertoires. Vous pouvez utiliser Sudo updatedb
avant d'utiliser l'utilitaire locate
name__. updatedb
s'exécute généralement une fois par jour sur les systèmes linux.
find est l’un des outils Linux/Unix les plus utiles.
Essayez find . -type d | grep DIRNAME
Les autres réponses sont bonnes, mais je trouve que omettre les instructions Permission denied
me donne des réponses plus claires (omet stderr
s 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 recherchef
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*
s dans le terme de recherche peut être omis si vous ne voulez pas que les caractères génériques soient dans la rechercheUne 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
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.
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
$ 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_*
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
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 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 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))