Comment rechercher un fichier par son nom et son chemin partiel?

64

Souvent, j'ai un nom de fichier et son chemin partiel, par exemple "content / docs / file.xml".

Existe-t-il un moyen simple de rechercher ce fichier sans couper manuellement son nom en plusieurs parties pour fournir le nom de répertoire et le nom de fichier séparément?

Ce serait génial si findje travaillais de cette façon, je pouvais donc courir find content/docs/file.xml, mais malheureusement ce n’est pas le cas.

slhck
la source
1
Vous pouvez essayer d'ajouter un caractère générique * au début. find -path *content/docs/file.xmla travaillé pour moi.
Bob
merci, @Bob, ça a vraiment fonctionné pour moi. Btw, intéressant, que si j'ajoute une barre oblique après un astérisque: "find -path * / content / docs / file.xml", cela ne fonctionnera pas. Merci quand même.
aussi, @Bob, merci de le définir comme une réponse et de la marquer comme correcte.
Si la barre oblique après l'astérisque n'a pas fonctionné, c'est probablement parce que l'astérisque aurait dû être échappé (voir la modification de ma réponse).
Bob

Réponses:

73

Transmettez un *caractère générique pour indiquer une correspondance avec quoi que ce soit . Vous devez également échapper au *s, par exemple:

find . -path \*content/docs/file.xml

ou mettez le motif entre guillemets, par exemple:

find . -path "*content/docs/file.xml"

Comme le décrit la page de manuel:

$ find. -name * .c -print

find: les chemins doivent précéder l'expression

Cela se produit parce que * .c a été développé par le shell, ce qui a permis à find de recevoir une ligne de commande comme celle-ci:

trouver . -nom bigram.c code.c frcode.c Locate.c -print

Cette commande ne va bien sûr pas au travail. Au lieu de procéder ainsi, vous devriez inclure le motif entre guillemets ou échapper au caractère générique:

$ find. -nom \ *. c -print

Bob
la source
10

find a aussi une option -wholename find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword
technosaurus
la source
Je ne connais pas le chemin complet, seulement partiel, donc "-wholename" ne fonctionnera pas.
le drapeau est trompeur, voir mon exemple ... il vous permet simplement d'étendre la chaîne dans un répertoire si vous le savez
technosaurus
3
find . -type f | grep "content/docs/file.xml"

ou juste

locate content/docs/file.xml
Fusil
la source
La localisation est une option intéressante, mais elle recherche sur tout le disque. J'aimerais pouvoir spécifier le répertoire de recherche de base ou au moins spécifier avec param, cette recherche doit être effectuée à partir de ce répertoire (comme le fait votre première option). , pas de la racine.
1
@ user69817 - au contraire, location ne recherche pas sur le disque, il interroge une base de données de localisation, qui est généralement renseignée via cron une fois par jour.
tink
1

Par exemple, rechercher des fichiers dans un emplacement à l'aide d'un astérisque / caractère générique ( *) en tant que: dir=“/apps/*/instance01/" vous pouvez utiliser find ${dir} -name “*.jks”. mettre tous les fichiers dans un tableau comme celui-ci:

arr=(`find ${dir} -name “*.jks"`)

si vous voulez obtenir des fichiers avec d'autres extensions, utilisez 'ou' comme ceci:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" parce -nameque n'accepte qu'une seule chaîne, utilisez donc 'ou'.

Enfin, mettez tout dans un tableau comme ceci:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

Si vous avez des chemins complets et non des chemins partiels, il est beaucoup plus facile de les placer dans des tableaux comme celui-ci:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
utilisateur450631
la source