Comment trouver un fichier dans nimporte quel répertoire

Jessaye de rechercher un fichier appelé Book1 .

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

Jai essayé find / -iname book1 mais il ny a pas de sortie.

Comment puis-je trouver mon fichier appelé book1 en utilisant la ligne de commande si je ne sais pas où se trouve le fichier?

EDIT:

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

  1. Lextension de fichier est inconnue
  2. Le nom exact (cest-à-dire les lettres majuscules, les chiffres, etc.) est inconnu
  3. Le lemplacement du fichier est inconnu

Commentaires

  • Sil existe un fichier appelé Book1, et cest dans un répertoire que vous pouvez lire, alors find / -iname book1 le trouvera. Êtes-vous sûr quil sagit bien de Book1 et non de Book1.xyz?
  • Le nom complet du fichier est Book1. gnumérique. Êtes-vous en train de 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 javais ‘ besoin était le nom général du fichier. Mon test essaie de trouver un fichier si, par exemple, je ne me souviens ‘ de l’extension du fichier et ne connais que le nom du fichier que je ‘ m cherche. Sil vous plaît aviser.
  • @don_crissti Terminé. Veuillez consulter la section Modifier ci-dessus.
  • Vous mélangez find et locate. locate est généreux, et trouvera tout ce qui correspond, à condition quil soit dans sa base de données, qui est normalement mise à jour quotidiennement. find, dans ce cas, recherche un fichier glob, le type de modèle que vous utiliseriez dans 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 que find ne puisse le voir. Notez également que find, comme de nombreuses commandes * nix, est terriblement silencieux en cas déchec.

Réponse

Premièrement, un argument de -iname est un motif de shell. Pour en savoir plus sur les modèles, consultez le manuel Bash . Lessentiel est que pour que find trouve un fichier, le nom de fichier doit correspondre au modèle spécifié. Pour quune chaîne insensible à la casse book1 corresponde à Book1.gnumeric, vous devez soit ajouter * donc il ressemble à ceci:

find / -iname "book1*" 

ou spécifiez le nom complet:

find / -iname "Book1.gnumeric" 

Second , -iname fera find ignorer la casse du nom de fichier, donc si vous spécifiez -iname book1, cela peut aussi trouver Book1, bOok1 etc. Si vous « êtes sûr que le fichier que vous » recherchez sappelle Book1.gnumeric alors nutilisez pas -iname mais -name, ce sera plus rapide:

find / -name "Book1.gnumeric" 

Troisièmement, noubliez pas de citer le modèle comme indiqué dans l autre réponse .

Et les derniers – sont vous êtes 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 avez travaillé dessus ou téléchargé de quelque part. Encore une fois, cela peut être beaucoup plus rapide.

EDIT :

Jai remarqué que vous avez modifié votre question. Si vous ne connaissez pas le nom complet du fichier, les majuscules et lemplacement, vous devriez 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 toutes les erreurs *permission denied* et autres qui seront présentes si vous invoquez find comme un utilisateur non root:

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

Et si vous « êtes sûr » de rechercher un seul fichier, et quil ny a quun seul fichier sur votre système correspondant aux critères que vous pouvez dire à find de quitter après avoir trouvé le premier fichier correspondant:

find / -iname "book1*" -print -quit 2>/dev/null 

Commentaires

Réponse

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

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

locate -i book1 

si vous souhaitez rechercher des fichiers commençant par book1, vous devrez faire le joker vous-même:

locate -i "book1*" 

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

Commentaires

  • Aucun de ceux-ci na produit de sortie pour moi: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

Réponse

Si vous savez que vous avez un fichier appelé book1.something, où lemplacement du fichier, la valeur exacte de something , et le modèle de majuscule du nom de fichier sont tous inconnus:

find / -iname "book1.*" 

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

find / -iname "*book*" 

Largument de -name est un modèle de shell glob. À 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 

Ceci représente le type de recherche effectuée par -name. Loption -iname permet simplement une version insensible à la casse de ceci.

Réponse

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 cas , mais en considérant uniquement les caractères latins ASCII bokBOK, pas les nombreuses autres variantes dUnicode telles que 𝗄, 𝚔, 𝘬, , , , et toutes leurs variantes avec signes diacritiques …) dans tous les répertoires auxquels vous avez accès en lecture.

Réponse

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

ls -a /**/book1 

Cela va trouver tous les emplacements où se trouve un fichier appelé book1.

Dans mes tests, cela semble être plus rapide que dutiliser find, et il produit également peu ou pas derreurs dautorisation utilisateur lorsquil est exécuté sans autorisation root

Voir manuel .

Réponse

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

Ce formulaire prendrait en compte 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 à nimporte 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 dutiliser simplement /, comme essayer uniquement /home, sinon vous descendrez dans certains répertoires qui ne sont pas pertinents (/sys, /dev, etc…)

Rappelez-vous cependant que Unix permissi les règles sappliquent: si le fichier se trouve dans un répertoire pour lequel lutilisateur exécutant la commande find na pas de droit daccès (dexécution), find ne pas pouvoir le trouver là-bas.

Commentaires

  • iregex a gagné ‘ t travailler dans des endroits comme Solaris (le système dexploitation na pas été spécifié) (et éventuellement * BSD), il sagit dune extension GNU et ne fait pas partie de la standard find

Réponse

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 PATTERN

Réponse

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 localiser nest pas disponible lable, vous pouvez utiliser find à la place. Cela 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 na 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 nincluez pas -xdev find recherche des éléments sur dautres partitions, comme /proc et /sys, qui ont tendance à inonder votre écran derreurs, 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 le faites pas  » ne sachant pas sur quel fichier se trouve le fichier, vous pouvez obtenir une liste avec lsblk (sur les systèmes dexploitation Linux, lanalyse de la sortie df est une option sinon) et insérez cela 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. 

(Cest un peu fragile si lun de vos points de montage contient des espaces) (les paramètres df peuvent avoir besoin dêtre ajustés. -P rend GNU df donne une sortie POSIX standard. Autre les versions peuvent avoir dautres paramètres ou avoir besoin de les laisser de côté. Lisez votre page de manuel)

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

Dans la version non-GNU, awk trouve les périphériques avec un montage commençant par /dev pour obtenir des systèmes de fichiers réels et ensuite imprimer le dernier champ d (le point de montage) de la sortie df.

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

Commentaires

  • Les grep peuvent être un peu bruyants, apprenez à le filtrer mieux (cela ne devrait pas être nécessaire avec lexemple, mais si cest quelque chose de plus courant qui est recherché, le greps nécessiterait un réglage pour réduire les niveaux de bruit)

Réponse

ag (le chercheur dargent) 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 dutilisation ici, cest> 30 fois plus rapide si le fichier nest pas un fichier ignoré par ag.

Réponse

find / -type f -iname "book[0-9].*" 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *