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 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?
ÉDITER:
Mon scénario est décrit plus en détail ci-dessous:
- L'extension du fichier est inconnue
- Le nom exact (c.-à-d. Lettres majuscules, chiffres, etc.) est inconnu
- L'emplacement du fichier est inconnu
command-line
files
find
Aspire27
la source
la source
Book1
et qu'il se trouve dans un répertoire que vous pouvez lire, ilfind / -iname book1
le trouvera. Êtes-vous sûr que c'est effectivement le casBook1
, et nonBook1.xyz
?find
etlocate
.locate
est 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 utiliseriezls
. Vous voulez probablement direiname '*book1*'
. Notez que le modèle doit être entre guillemets pour empêcher le shell de le développer avantfind
de le voir. Notez également quefind
, comme de nombreuses commandes * nix, elle est frustrante et silencieuse lorsqu'elle échoue.Réponses:
Tout d'abord, un argument pour
-iname
est 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:book1
Book1.gnumeric
*
ou spécifiez le nom complet:
Deuxièmement,
-iname
ferafind
ignorer la casse du nom de fichier, donc si vous spécifiez,-iname book1
il pourrait également trouverBook1
,bOok1
etc. Si vous êtes sûr que le fichier que vous recherchez est appeléBook1.gnumeric
, ne l'utilisez pas ,-iname
mais-name
ce sera plus rapide: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
$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.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:
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 enfind
tant qu'utilisateur non root: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
find
de quitter après avoir trouvé le premier fichier correspondant:la source
-iname
n'est pas portableVous pouvez essayer la
locate
commande. 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 utilisersi vous souhaitez rechercher des fichiers commençant par,
book1
vous devrez effectuer le joker vous-même: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.la source
Si vous savez que vous avez un fichier appelé
book1.something
, où l'emplacement du fichier, la valeur exactesomething
et le modèle de capitalisation du nom de fichier sont tous inconnus: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 avecL'argument de
-name
est un modèle de glob de shell. À partir du répertoire dans lequel se trouve le fichier, comparez:Cela représente le type de recherche effectuée par
-name
. L'-iname
option permet simplement une version insensible à la casse de cela.la source
POSIXly,
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 ASCIIbokBOK
, pas les nombreuses autres variantes en Unicode comme𝗄
,𝚔
,𝘬
,ᵏ
,ₖ
,K
,k
et toutes leurs variations avec diacritiques ...) en tous les répertoires auxquels vous avez accès en lecture.la source
Pour ces types de tâches, je fais toujours:
find / -iregex '.*Book1.*'
Ce formulaire prendrait en charge les 3 points de votre scénario (
iregex
est 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/home
ou 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
find
commande n'a pas de droit d'accès (exécuter),find
il ne pourra pas le trouver.la source
find
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 MOTIFla source
locate
et ses variantes ont tendance à être une méthode rapide.Si la localisation n'est pas disponible, vous pouvez utiliser à la
find
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)
Si vous n'incluez pas les
-xdev
find
recherches sur les 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 ajoutant2> /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 ladf
sortie est une option sinon) et l'introduire dans find: (root à nouveau si vous je ne sais pas si vous pouvez accéder au fichier)(C'est un peu fragile si l'un de vos points de montage contient des espaces) (les
df
paramètres peuvent nécessiter un réglage. -P oblige GNU àdf
fournir une sortie POSIX standard. D'autres versions peuvent avoir d'autres paramètres ou en avoir besoin. Lisez votre page de manuel)L'
grep -F
exclut 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
/dev
pour obtenir de vrais systèmes de fichiers, puis imprime le dernier champ (le point de montage) de ladf
sortie.Cela suppose également un shell de type bourne (
ksh
etbash
devrait fonctionner. Si vous utilisez unecsh
variante, démarrez un shell scriptable avant d'essayer)la source
grep
s 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)ag (le chercheur argenté) fournit une recherche très rapide dans les fichiers, et a également une option pour rechercher le nom de fichier:
Donc, dans mon cas d'utilisation, c'est> 30 fois plus rapide si le fichier n'est pas un fichier ignoré par ag.
la source