web-dev-qa-db-fra.com

Comment trouver un fichier à partir de n'importe quel répertoire

J'essaie de chercher un fichier appelé Book1.

Dans mon test, j'essaie de rechercher le fichier susmentionné et dans ce test, je ne sais pas où se trouve ce fichier.

J'ai essayé find / -iname book1 mais il n'y a pas de sortie.

Comment trouver mon fichier appelé book1 à l'aide de la ligne de commande si je ne sais pas où se trouve le fichier?

MODIFIER:

Mon scénario est décrit plus en détail ci-dessous:

  1. L'extension du fichier est inconnue
  2. Le nom exact (c.-à-d. Lettres majuscules, chiffres, etc.) est inconnu
  3. L'emplacement du fichier est inconnu
25
Aspire27

Tout d'abord, un argument pour -iname est un Shell motif. Vous pouvez en savoir plus sur les modèles dans Bash manual . L'essentiel est que pour que find puisse réellement trouver un fichier, le nom de fichier doit correspondre au modèle spécifié. Pour rendre une chaîne insensible à la casse book1 rencontre Book1.gnumeric vous devez soit ajouter * donc ça ressemble à ça:

find / -iname 'book1*'

ou spécifiez le nom complet:

find / -iname 'Book1.gnumeric'

Seconde, -iname fera que find ignorera la casse du nom de fichier, donc si vous spécifiez -iname book1 il pourrait également trouver Book1, bOok1 etc. Si vous êtes sûr que le fichier que vous recherchez s'appelle Book1.gnumeric alors n'utilisez pas -iname mais -name, ce sera plus rapide:

find / -name 'Book1.gnumeric'

Troisièmement, n'oubliez pas de citer le modèle comme indiqué dans autre réponse .

Et enfin - êtes-vous sûr de vouloir rechercher le fichier partout sur votre système? Il est possible que le fichier que vous recherchez se trouve réellement dans votre $HOME répertoire si vous y avez travaillé ou que vous l'avez téléchargé quelque part. Encore une fois, cela peut être beaucoup plus rapide.

[~ # ~] éditez [~ # ~] :

J'ai remarqué que vous avez modifié votre question. Si vous ne connaissez pas le nom de fichier complet, la capitalisation et l'emplacement, vous devez en effet utiliser quelque chose comme ceci:

find / -iname 'book1*'

Je suggère également de mettre 2>/dev/null à la fin de la ligne pour masquer tout *permission denied* et d'autres erreurs qui seront présentes si vous appelez find en tant qu'utilisateur non root:

find / -iname 'book1*' 2>/dev/null

Et si vous êtes sûr de rechercher un seul fichier, et qu'il n'y a qu'un seul fichier sur votre système qui correspond aux critères, vous pouvez dire à find de quitter après avoir trouvé le premier fichier correspondant:

find / -iname 'book1*' -print -quit 2>/dev/null
35
Arkadiusz Drabczyk

Vous pouvez essayer la commande locate. Il utilise une base de données de noms de fichiers pour accélérer la recherche.

Pour rechercher tous les fichiers correspondants *book1*, et en ignorant la casse, vous pouvez utiliser

locate -i book1

si vous voulez rechercher des fichiers début avec book1 vous devrez faire le joker vous-même:

locate -i 'book1*'

Il est beaucoup plus rapide que find, mais n'est aussi à jour que lors de la dernière actualisation de la base de données.

6
James K

Si vous savez que vous avez un fichier appelé book1.something, Où l'emplacement du fichier, la valeur exacte de something et le modèle de capitalisation du nom de fichier sont tous inconnus:

find / -iname 'book1.*'

Si tout ce que vous savez avec certitude est que le nom de fichier contient le mot book, vous pouvez générer une liste probablement beaucoup plus grande avec

find / -iname '*book*'

L'argument de -name Est un modèle global de Shell. À partir du répertoire dans lequel se trouve le fichier, comparez:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

Cela représente le type de recherche effectuée par -name. L'option -iname Permet simplement une version insensible à la casse de ceci.

5
Fox

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Rapportera le chemin de tous les fichiers dont le nom contient book1 (avec toute variation de casse, mais uniquement en tenant compte des ASCII caractères latins bokBOK, et non des nombreuses autres variantes d'Unicode comme ????, ????, ????, , , , et toutes leurs variantes avec des signes diacritiques ...) dans tous les répertoires auxquels vous avez accès en lecture.

1
Stéphane Chazelas

ag (le chercheur argenté) fournit une recherche très rapide dans les fichiers, et a également une option pour rechercher le nom de fichier:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Donc, dans mon cas d'utilisation, c'est> 30 fois plus rapide si le fichier n'est pas un fichier ignoré par ag.

0
tomtt

Silver Searcher est un utilitaire très rapide et pratique pour rechercher des fichiers et du contenu.

Pour résoudre votre problème, la commande Silver Searcher ressemblerait à ceci ...

ag -g Book1

-g PATTERN Imprimer les noms de fichiers correspondant au MOTIF

0
qoomon

Pour ces types de tâches, je fais toujours: find / -iregex '.*Book1.*'

Ce formulaire prend en charge les 3 points de votre scénario (iregex est une expression rationnelle insensible à la casse et le modèle avec .* des deux côtés correspondrait à n'importe quel caractère avant et après votre modèle fixe de Book1 - cela pourrait évidemment vous donner plus de résultats que nécessaire mais vous êtes sûr de ne pas manquer le fichier)

La principale différence: si possible, soyez plus restrictif que d'utiliser simplement /, comme essayer uniquement /home ou alors, sinon vous descendrez dans certains répertoires qui ne sont pas pertinents (/sys, /dev, etc…)

N'oubliez pas cependant que les autorisations Unix s'appliquent: si le fichier se trouve dans un répertoire pour lequel l'utilisateur exécutant la commande find n'a pas le droit d'accès (exécuter), find ne pourra pas le trouver.

0
Patrick Mevzek

Avec Zsh, vous pouvez utiliser des modèles glob, donc cela fonctionne aussi:

ls -a /**/book1

Cela trouvera tous les emplacements où un fichier appelé book1 vies.

Dans mes tests, cela semble être plus rapide que d'utiliser find, et cela produit également peu ou pas d'erreurs de permission utilisateur lorsqu'il est exécuté sans root autorisation

Voir manuel .

0
smac89
find /  -type f -iname "book[0-9].*" 
0
Praveen Kumar BS

locate et ses variantes ont tendance à être une méthode rapide.

# updatedb # run as root, possibly using Sudo, e.g. Sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Si la localisation n'est pas disponible, vous pouvez utiliser find à la place. Il a tendance à être beaucoup plus lent, mais aussi beaucoup plus précis.

Si vous avez une seule partition: (exécutez en tant que root si votre utilisateur n'a peut-être pas accès au fichier)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Si vous n'incluez pas -xdevfind recherche des choses sur d'autres partitions, comme /proc et /sys, qui ont tendance à inonder votre écran d'erreurs, surtout si vous n'êtes pas root. (Les erreurs peuvent être masquées en ajoutant 2> /dev/null à la fin de la commande find (le commentaire doit être supprimé))

Si vous avez plusieurs partitions et que vous ne savez pas sur laquelle se trouve le fichier, vous pouvez obtenir une liste avec lsblk (sur les systèmes d'exploitation Linux, l'analyse de la sortie df est une option sinon ) et introduisez-le dans find: (rootez à nouveau si vous ne savez pas si vous pouvez accéder au fichier)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(C'est un peu fragile si l'un de vos points de montage contient des espaces) (df les paramètres peuvent nécessiter un réglage. -P fait GNU df donne une sortie POSIX standard . D'autres versions peuvent avoir d'autres paramètres ou en avoir besoin. Lisez votre page de manuel)

Le grep -F exclut les autres éléments renvoyés, comme les partitions de swap.

Dans la version non GNU, awk recherche des périphériques avec un montage commençant par /dev pour obtenir de vrais systèmes de fichiers, puis imprimer le dernier champ (le point de montage) à partir de la sortie df.

Cela suppose également un shell de type bourne (ksh et bash devrait fonctionner. Si vous utilisez une variante csh, démarrez un shell scriptable avant d'essayer)

0
Gert van den Berg