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:
- Lextension de fichier est inconnue
- Le nom exact (cest-à-dire les lettres majuscules, les chiffres, etc.) est inconnu
- Le lemplacement du fichier est inconnu
Commentaires
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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
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].*"
Book1
, et cest dans un répertoire que vous pouvez lire, alorsfind / -iname book1
le trouvera. Êtes-vous sûr quil sagit bien deBook1
et non deBook1.xyz
?find
etlocate
.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 dansls
. Vous voulez probablement direiname '*book1*'
. Notez que le modèle doit être entre guillemets pour empêcher le shell de le développer avant quefind
ne puisse le voir. Notez également quefind
, comme de nombreuses commandes * nix, est terriblement silencieux en cas déchec.