Comment trouver un fichier par nom de fichier dans un terminal Mac OSX?


119

Je veux trouver un fichier sur mon macbook avec le nom de fichier: abc.dmg. J'ai essayé d'utiliser Spotlight, mais il ne l'a pas trouvé. Quand j'ai essayé de trouver, et utilisé find -name abc.dmg -path /:, j'ai eu des erreurs en retour.

Quelle est la syntaxe appropriée pour rechercher un fichier par nom de fichier avec la commande find sur un terminal Mac OSX?


1
@VxJasonxV Les questions Apple concernent le super utilisateur à 100% et il n'est pas vraiment nécessaire que toutes les questions Apple y soient déplacées. Les questions iPhone ou iPad seront toutefois déplacées si nécessaire.
BinaryMisfit

Ce n'était pas vraiment une raison d'être hors-sujet, mais le fait qu'il existe un sujet / site plus spécifique pour ce sujet général.
VxJasonxV

@Diago: Y a-t-il eu des discussions à ce sujet sur meta ou chat? Je me demandais simplement parce qu'AFAIK apple.SE devrait bientôt sortir de la version bêta.
Robert S Ciaccio

1
@calavera. Une discussion assez ancienne mais pertinente peut être trouvée ici . Apple SE, Ubuntu SE et Linux SE sont tous là pour complimenter Super User, mais nous ne voulons en aucun cas obliger les utilisateurs à se déplacer. Je préfère poser mes questions Apple ici plutôt qu'Apple, car j'utilise 3 systèmes d'exploitation différents. Si j'ai une question très précise, je la poserai sur un site plus spécialisé.
BinaryMisfit

Réponses:


164

Dans sa forme la plus simple, findprend un paramètre: le chemin. Dans sa forme réellement utile, il emprunte le chemin suivi par des critères restrictifs.

Ainsi, vous voulez:

  • find (le programme)
  • / (le chemin), et
  • -name abc.dmg (le critère).
find / -name abc.dmg

12
Vous pouvez obtenir des erreurs de type autorisation refusée lors de la recherche de l'intégralité du lecteur, mais elles peuvent être ignorées sauf si vous vous attendez à ce que le fichier se trouve dans un dossier restreint. Si oui, utilisez sudo find / -name abc.dmg
Chris Nava

J'ai essayé, mais aucun résultat.
SPRBRN

6
Vraisemblablement, vous n'avez pas de fichier nommé abc.dmg sur votre ordinateur. Vous pouvez utiliser -iname au lieu de -name pour rendre la casse de recherche insensible. Je doute fort que vous recherchiez réellement "abc.dmg", et étant donné (vraisemblablement) le fait, il est difficile de vous dire quel est votre problème sans avoir les détails.
VxJasonxV

2
@rxt: si trouver ne le trouve pas, ce n'est pas là ...
Robert S Ciaccio

5
Étant donné que OP rapport ont essayé de trouver dans le texte de la question, il est à noter que l'ordre des arguments pour les find questions . Si doit être find [path]+ [selection, grouping, and actions].
dmckee

23

find . -name '*.csv'par exemple, a travaillé pour moi avec des wildcards. OP pourrait également utiliser find . -name '*.dmg'pour vérifier son répertoire actuel, en supposant qu'il soit dans /.



6

Vous pouvez utiliser la locatecommande.

locate abc.dmg

2
Notez la osxbalise. slocate db ne peuplera pas par défaut.
VxJasonxV

Essayé, après avoir créé la base de données, mais aucun résultat.
SPRBRN

si locateet les mdfinddeux échouent, les chances sont que le fichier est pas sur votre machine. Ou ce n'est pas nommé comment vous pensez son nommé. Peut-être que la recherche de TOUS les DMG pourrait être votre prochaine étape?
peelman

3

La manière la plus simple (que vous avez déjà déjà essayée, mais bon, laissez-moi l’ajouter quand même au fil) est d’entrer abc.dmg dans le champ de recherche situé en haut à droite de toute fenêtre du Finder, puis de sélectionner "Fichier". Nom "parmi les options de la barre de recherche qui apparaît.

Pas besoin de terminal.

N'oubliez pas non plus que Spotlight n'indexe que les répertoires spécifiés dans le panneau de configuration de Spotlight et que abc.dmg peut ne pas figurer dans l'un de ces répertoires.

Corrigez-moi si je me trompe, mais je pense que la commande find a besoin de savoir quoi afficher:

find / -name abc.dmg -print

... devrait imprimer tous les résultats sur le terminal (y compris les erreurs d'autorisation).

Si vous ne voulez pas d'erreurs d'autorisation et souhaitez effectuer une recherche dans d'autres répertoires d'utilisateurs, procédez comme suit:

sudo find / -name abc.dmg -print

2

Vous pouvez utiliser les fonctions de ligne de commande suivantes pour trouver et ouvrir rapidement un fichier pertinent. Je trouve cela plus facile que de taper une longue chaîne de requête dans la fenêtre Spotlight.

Ajouter les fonctions suivantes dans ~/.bash_aliases.

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Maintenant, source ~/.bash_aliasesouvrez une nouvelle fonction de chargement du terminal ou ouvrez-la. Pour rechercher des fichiers avec des mots, un camembert et 2016 n'importe où dans le nom du fichier, faites

spot pie*2016 #or
spot 2016*pie

Il n’est pas nécessaire d’ajouter ou d’ajouter *à votre requête le motif de recherche, mais il '*$1*'balise déjà les caractères génériques au début et à la fin de votre requête. Supplémentaire cdest pour insensibles à la casse et en ignorant les marques diacritiques, par exemple, fredretournera les deux, Frédéric et Frédéric.

findpaperlimitera la recherche aux résultats dans un chemin spécifique (récursif) tout openpaper pie*201en ouvrant un résultat de recherche (ou le premier des résultats multiples) ou openpaper pie*201 3en ouvrant une troisième entrée de résultat. Pour éviter d'ouvrir des scripts bash ou d'autres fichiers non documentés, vous pouvez limiter le contenu du fichier en utilisant des attributs de recherche supplémentaires. Voir Syntaxe d'expression des requêtes de métadonnées de fichier et https://ss64.com/osx/mdfind.html pour l'utilisation d'autres opérateurs de recherche.


Impressionnant!
Restez tranquille

0

Capturez une liste de tous les fichiers de votre disque en tant que racine depuis /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Cat du fichier entier via grep pour rechercher le lecteur entier:

cat ~/file-list.txt | grep abc.dmg

Utilisez des expressions régulières pour afficher uniquement les fichiers .jpg et .dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Résultat:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

...etc. Malheureusement, tous les disques montés seront également capturés. Il est donc préférable d'éjecter ceux de Time Machine, car ils ont beaucoup de liens. Donc, dans une autre fenêtre, je lance watch tail -n 10 ~/file-list.txtce qui me montre où cela en est dans mon ignoble hack!


1
Mauvaises pratiques ou des choses qui méritent un commentaire: (1) sudo find / > ~/file-list.txtsemble mieux que d'exécuter le shell entier en tant que root. (2) find *ignorera les objets cachés (points) (le cas échéant) dans /. (3) &>est un bashisme. (4) Utilisation inutile de cat. (5) grep abc.dmgimprimera par exemple /foo/bar/123abcXdmg456/baz/whatever. // Une bonne chose que votre réponse apporte à ce fil (et une autre réponse ne le fait pas) est l'approche où l'utilisateur exécute findune fois puis réutilise le résultat enregistré plusieurs fois sans interroger le (s) système (s) de fichiers encore et encore. Cet avantage potentiel n'est cependant pas accentué.
Kamil Maciorowski

bon point merci Kamil, ont fait cela et aussi chown $ (whoami)
Tomachi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.