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

22

J'essaie de rechercher 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 book1mais 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?

ÉDITER:

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
Aspire27
la source
2
S'il y a un fichier appelé Book1et qu'il se trouve dans un répertoire que vous pouvez lire, il find / -iname book1le trouvera. Êtes-vous sûr que c'est effectivement le cas Book1, et non Book1.xyz?
Fox
Le nom complet du fichier est Book1.gnumeric. Voulez-vous dire que je dois spécifier le nom complet du fichier? Pour une raison quelconque, je pensais, pour cette commande spécifique, que tout ce dont j'avais besoin était le nom général du fichier. Mon test essaie de trouver un fichier si, par exemple, je ne me souviens pas de l'extension du fichier et je ne connais que le nom du fichier que je recherche. S'il vous plaît donnez votre avis.
Aspire27
@don_crissti Terminé. Veuillez voir ci-dessus Modifier.
Aspire27
Vous mixez find et locate. locateest généreux et trouvera tout ce qui correspond, tant qu'il se trouve dans sa base de données, qui est normalement mise à jour quotidiennement. find, dans ce cas, recherche un fichier global, le type de modèle que vous utiliseriez ls. Vous voulez probablement dire iname '*book1*'. Notez que le modèle doit être entre guillemets pour empêcher le shell de le développer avant findde le voir. Notez également que find, comme de nombreuses commandes * nix, elle est frustrante et silencieuse lorsqu'elle échoue.
Manngo

Réponses:

31

Tout d'abord, un argument pour -inameest un modèle de shell . Vous pouvez en savoir plus sur les modèles dans le manuel de Bash . L'essentiel est que pour trouverfind réellement un fichier, le nom de fichier doit correspondre au modèle spécifié. Pour faire une correspondance de chaîne insensible à la casse , vous devez soit l'ajouter pour qu'elle ressemble à ceci:book1Book1.gnumeric*

find / -iname 'book1*'

ou spécifiez le nom complet:

find / -iname 'Book1.gnumeric'

Deuxièmement, -inamefera findignorer la casse du nom de fichier, donc si vous spécifiez, -iname book1il pourrait également trouver Book1, bOok1etc. Si vous êtes sûr que le fichier que vous recherchez est appelé Book1.gnumeric , ne l'utilisez pas , -inamemais -namece sera plus rapide:

find / -name 'Book1.gnumeric'

Troisièmement, n'oubliez pas de citer le modèle comme indiqué dans l' 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 $HOMEré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.

MODIFIER :

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 utiliser quelque chose comme ceci:

find / -iname 'book1*'

Je suggère également de mettre 2>/dev/nullà la fin de la ligne pour masquer toutes les *permission denied*erreurs et autres qui seront présentes si vous invoquez en findtant 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 que vous pouvez dire findde quitter après avoir trouvé le premier fichier correspondant:

find / -iname 'book1*' -print -quit 2>/dev/null
Arkadiusz Drabczyk
la source
1
-inamen'est pas portable
Gert van den Berg
6

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

Pour rechercher toutes les correspondances de fichiers *book1*et en ignorant la casse, vous pouvez utiliser

locate -i book1

si vous souhaitez rechercher des fichiers commençant par, book1vous devrez effectuer 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.

James K
la source
5

Si vous savez que vous avez un fichier appelé book1.something, où l'emplacement du fichier, la valeur exacte somethinget 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 -nameest un modèle de glob 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' -inameoption permet simplement une version insensible à la casse de cela.

Renard
la source
1

POSIXly,

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

Rapportera le chemin de tous les fichiers dont le nom contient book1(avec une variation de cas, mais seulement en tenant compte des caractères latins ASCII bokBOK, pas les nombreuses autres variantes en Unicode comme 𝗄, 𝚔, 𝘬, , , , et toutes leurs variations avec diacritiques ...) en tous les répertoires auxquels vous avez accès en lecture.

Stéphane Chazelas
la source
0

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

Ce formulaire prendrait en charge les 3 points de votre scénario ( iregexest une expression rationnelle insensible à la casse, et le motif 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, être plus restrictive que la simple utilisation /, comme essayer seulement /homeou si, 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 findcommande n'a pas de droit d'accès (exécuter), findil ne pourra pas le trouver.

Patrick Mevzek
la source
iregex ne fonctionnera pas dans des endroits comme Solaris (le système d'exploitation n'a pas été spécifié) (et peut-être * BSD), c'est une extension GNU et ne fait pas partie de la normefind
Gert van den Berg
0

Silver Searcher est un outil 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

qoomon
la source
0

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 à la findplace. 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 les -xdev findrecherches sur les autres partitions, comme /procet /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 dfsortie est une option sinon) et l'introduire dans find: (root à nouveau si vous je ne sais 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) (les dfparamètres peuvent nécessiter un réglage. -P oblige GNU à dffournir une sortie POSIX standard. D'autres versions peuvent avoir d'autres paramètres ou en avoir besoin. Lisez votre page de manuel)

L' grep -Fexclut les autres choses retournées, comme les partitions de swap.

Dans la version non GNU, awk recherche des périphériques avec un montage commençant par /devpour obtenir de vrais systèmes de fichiers, puis imprime le dernier champ (le point de montage) de la dfsortie.

Cela suppose également un shell de type bourne ( kshet bashdevrait fonctionner. Si vous utilisez une cshvariante, démarrez un shell scriptable avant d'essayer)

Gert van den Berg
la source
Le greps peut être un peu bruyant, apprenez à mieux le filtrer (cela ne devrait pas être nécessaire avec l'exemple, mais si c'est quelque chose de plus commun qui est recherché, les greps auraient besoin d'un réglage pour maintenir les niveaux de bruit bas)
Gert van den Berg
0

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.

tomtt
la source