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:
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
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.
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.
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 ????
, ????
, ????
, ᵏ
, ₖ
, K
, k
et toutes leurs variantes avec des signes diacritiques ...) dans tous les répertoires auxquels vous avez accès en lecture.
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.
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
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.
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 .
find / -type f -iname "book[0-9].*"
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 -xdev
find
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)